在隐式类型转换期间,最多可隐式应用多少用户定义的转换运算符?

时间:2016-02-13 01:01:39

标签: c++ c++11 language-lawyer implicit-conversion g++4.8

根据N3337工作草案(与ISOC ++ 11标准最相似的草案),答案最多只有一个。

N3337

  

最多一个用户定义的转换(构造函数或转换   function)隐式应用于单个值。

[ Example:

struct X {
    operator int();
};

struct Y {
    operator X();
};

Y a;
int b = a; // error
           // a.operator X().operator int() not tried

int c = X(a); // OK: a.operator X().operator int()

—end example ]

但根据使用 gcc(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4 编译 main.cpp 并运行 a.out的结果使用 Ubuntu 14.04.3 LTS 中的引用语句,答案最多不是一个。

的main.cpp

#include <iostream>

struct As
{
    operator int(){ std::cout<<"operator As::int()"<<std::endl; return 1; }
};

struct Bs
{
    operator int(){ std::cout<<"operator Bs::int()"<<std::endl; return As(); }
};

int main()
{
     int i=Bs();

     return 0;
}

从终端编译并运行:

$ g++ -std=c++11 main.cpp
$ ./a.out

结果(输出):

operator Bs::int()
operator As::int()

我是否误解了某些内容或N3337是否错误或者gcc是否包含错误?

2 个答案:

答案 0 :(得分:5)

此处没有双重转换。

您可以在两个不同的位置进行两次单独转换。

一次转化位于B::operator int()

第二次转换位于main()

让我们尝试逻辑思考:

完全从翻译单元中删除main()。你看到任何双重转换吗?

没有

现在,让我们创建一个包含以下位的头文件,称之为structures.H

struct As
{
    operator int();
};

struct Bs
{
    operator int();
};

现在,创建一个structures.C文件,其中包含每个运算符的内容:

#include <structures.H>

B::operator int(){ std::cout<<"operator As::int()"<<std::endl; return 1; }
A::operator int(){ std::cout<<"operator Bs::int()"<<std::endl; return As(); }

好的,你还能看到任何双重转换吗?否。

现在,创建你的main.C:

#include <structures.H>

int main()
{
     int i=Bs();

     return 0;
}

你看到在这里发生了双重转换吗?不,即使我们现在拥有两个翻译单元,您开始使用相同的确切代码。

答案 1 :(得分:2)

int i=Bs();隐含地调用Bs::operator int()

return As()隐式调用As::operator int()

这是两个单独的表达。