我写了这个例子:
#include <iostream>
struct A
{
A(const A&){ std::cout << "A(const A&)" << std::endl; }
A(){ std::cout << "A()" << std::endl; }
};
struct B
{
B(){ std::cout << "B()" << std::endl; }
operator A(){ std::cout << "operator A()" << std::endl; return A(); }
};
B b;
void foo(A) { }
int main(){ std::cout << "main function starting..." << std::endl; foo(b); }
一切正常,但如果我们将B b;
替换为const B b;
则无法正常工作。
#include <iostream>
struct A
{
A(const A&){ std::cout << "A(const A&)" << std::endl; }
A(){ std::cout << "A()" << std::endl; }
};
struct B
{
B(){ std::cout << "B()" << std::endl; }
operator A(){ std::cout << "operator A()" << std::endl; return A(); }
};
const B b;
void foo(A) { }
int main(){ std::cout << "main function starting..." << std::endl; foo(b); }
尽管标准在13.3.3.1/6 [over.best.ics]
部分中说明了
顶级cv资格的任何差异都包含在 初始化本身并不构成转换。
我希望有人向我解释为什么这个例子不起作用。
答案 0 :(得分:0)
您引用的行位于标题为 13.3.3.1.1标准转换序列的部分下。从B
到A
的转换是用户定义的转化。用户定义的转换规则属于标准的下一部分,标题为 13.3.3.1.2用户定义的转换序列
您引用的内容不适用于用户定义的转化。