然后,该代码能使用istream的bool类型转换运算符将cin转换为bool,而这个bool值接着会被提升成int并用作内置的左移运算符的左侧运算对象。这样一来,提升后的bool值(0或1)最终会被左移42个位置,这一结果显然与我们的与其大相径庭 C++11标准 为了解决上面出现的问题,C++11标准中,IO标准库通过定义一个向bool的显示...
但是 bool a = 类A实例变量,即使这个类有重载bool函数,没加explicit会隐私转化调用operator bool()...
| Complexdouble01-without-explicit.cpp:22:10: note: candidate: ‘bool Complex::operator==(Complex)’22| booloperator==(Complex rhs) | ^~~~01-without-explicit.cpp:22:29: note: no known conversionforargument1from‘double’to‘Complex’22| booloperator==(Complex rhs) 这时候需要我们进行显式...
在源类型中定义隐式类型转换, 可以通过目的类型名的类型转换运算符实现 (例如 operatorbool()). 在目的类型中定义隐式类型转换, 则通过以源类型作为其唯一参数 (或唯一无默认值的参数) 的构造函数实现. int k = 7.7; // warning C4244:'initializing':conversion from 'double' to // 'int', possible ...
> 1. 当我们加了explicit时,我们发现编译器报错了。> > 2. 原因是explicit 限制了 构造函数发生隐式类型转化。> > 无法将 A b = 1; 变为: A b = A(1);> > 3. 从而导致编译...
structA{A(int){}// converting constructorA(int,int){}// converting constructor (C++11)operatorbool()const{returntrue;}};structB{explicitB(int){}explicitB(int,int){}explicitoperatorbool()const{returntrue;}};intmain(){A a1=1;// OK: copy-initialization selects A::A(int)Aa2(2);// ...
explicit operatorbool()const{returntrue; } };voiddoA(A a){}voiddoB(B b){}intmain(intargc,char* argv[]){ Aa1(1);//OK:直接初始化A a2 =1;//OK:复制初始化A a3{2};//OK:直接列表初始化A a4 = {2};//OK:复制列表初始化A a5 = (A)1;//OK:允许static_cast的显示转换doA(1);//...
explicit,implicit,operator 重载运算符 explicit关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 implicit关键字用于声明隐式的用户定义类型转换运算符。如果转换过程可以确保不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。 operator关键字用于在类或结构声明中声明运算符...
上面的列表初始化就已经会让人看到这是一个字符串的初始化,和先前的print(3)明显区分了。 此外我们还可以使用explicit修饰重载类型符,比如: 代码语言:javascript 复制 structA{explicitA(int n){}explicit operatorbool()const{returntrue;}};Aa(1);bool b=a;// 编译错误,不能隐式转换。
#include <iostream>using std::cout;using std::endl;template<class T>class Ptr{public:Ptr(T* p) :m_p(p) {}operator bool() const{return m_p != nullptr ? true : false;}private:T* m_p;};int main(){int a = 11;Ptr<int> p(&a);if(p){cout << "valid pointer." << endl;...