C++ 在隐式类型转换期间,最多可以隐式应用多少个用户定义的转换运算符?
根据工作草案N3337(与已发布的ISOC++11标准最相似的草案),答案最多是一个 N3337: 最多一个用户定义的转换(构造函数或转换 函数)隐式应用于单个值C++ 在隐式类型转换期间,最多可以隐式应用多少个用户定义的转换运算符?,c++,c++11,language-lawyer,implicit-conversion,g++4.8,C++,C++11,Language Lawyer,Implicit Conversion,G++4.8,根据工作草案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 =
[ 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(ubuntu4.8.4-2ubuntu1~14.04)4.8.4编译main.cpp并使用ubuntu14.04.3lts中引用的语句运行a.out的结果,答案最多不是一个
main.cpp:
结果(输出):
是我误解了什么,还是N3337错了,还是gcc包含bug?这里没有执行双重转换 您有两个单独的转换发生在两个不同的地方 一个转换在
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(); }
#包括
操作符int(){std::coutinti=Bs();
隐式调用Bs::操作符int()
returnas()
隐式调用As::operator int()
这是两个独立的表达式。我理解。在表达式“int I=Bs()”(“int I=Bs().operator int()”)中只隐式调用了一个用户定义的转换运算符。但在表达式“return As()”(“return As().operator int()”)中隐式调用了另一个用户定义的转换运算符因此,隐式应用了两个用户定义的转换运算符。不在同一个表达式中,但引用的语句不读取任何关于单个表达式的内容。它只读取单个值。我们可以说,不同调用的值是不同的值,但语句“int b=a;”这也是有效的。@DánielSándor-回顾一下我给出的一个显式示例,其实际代码在逻辑和结构上与您的完全相同,只是使用了两个独立的翻译单元。当编译器编译main.cpp翻译单元时,它不知道另一个翻译单元中的内容。对于同一个iden来说,这毫无意义代码是否有效取决于同一翻译单元中是否有另一段代码可见。因此,尽管没有明确说明,但情况确实如此。对不起,应该是返回为();
而不是返回0;
??否则,我看不出A::operator int()如何
被调用了吗?
operator Bs::int()
operator As::int()
struct As
{
operator int();
};
struct Bs
{
operator int();
};
#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(); }
#include <structures.H>
int main()
{
int i=Bs();
return 0;
}