阅读this后,我尝试使用static_cast
进行转换:
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() const //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
A a;
//Original code, This is ambiguous,
//because both operator and constructor have same cv qualification (use -pedantic flag)
B b = a;
//Why isn't this ambiguous, Why is conversion constructor called,
//if both constructor and operator have same c-v qualification
B c = static_cast<B>(a);
return 0;
}
我预计它不会编译,因为构造函数和运算符都具有相同的 c-v限定。但是它成功编译并static_cast
调用构造函数而不是运算符。为什么?
(使用带有pedantic
和Wall
标志的gcc 4.8.1编译)
答案 0 :(得分:8)
C ++ 11标准说(强调我的):
5.2.9静态投射
4否则,如果声明{{1},则可以使用
e
格式的T
将表达式static_cast
显式转换为static_cast<T>(e)
类型对于一些发明的临时变量T t(e);
(8.5),它是格式良好的。这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换结果相同。当且仅当初始化将它用作glvalue时,表达式t
才用作glvalue。5否则,
e
将执行下面列出的转换之一。不能使用static_cast
明确执行其他转换。
这解释了
中static_cast
的原因
static_cast
最终调用B c = static_cast<B>(a);
的构造函数。
仅当B
格式不正确时才使用转换运算符。