根据 N3337 工作草案(与已发布的 ISOC++11 标准最相似的草案),答案最多是一个。
N3337:
最多一个用户定义的转换(构造函数或转换函数)被隐式应用于单个值。
[ 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并使用Ubuntu 14.04.3 LTS中引用的语句运行a.out的结果,答案最多不是一个。
主.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 是否包含错误?