CV限定类型无法转换为cv-nonqualified类型

时间:2014-12-06 06:08:24

标签: c++

我写了这个例子:

#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); }

DEMO

一切正常,但如果我们将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); }

DEMO

尽管标准在13.3.3.1/6 [over.best.ics]部分中说明了

  

顶级cv资格的任何差异都包含在   初始化本身并不构成转换。

我希望有人向我解释为什么这个例子不起作用。

1 个答案:

答案 0 :(得分:0)

您引用的行位于标题为 13.3.3.1.1标准转换序列的部分下。从BA的转换是用户定义的转化。用户定义的转换规则属于标准的下一部分,标题为 13.3.3.1.2用户定义的转换序列

您引用的内容不适用于用户定义的转化。