作者:mobiledu2502908141 | 来源:互联网 | 2022-12-02 17:45
请考虑以下代码:
#include
struct A
{
A(){}
explicit A(const A&) {std::puts("copy");}
};
int main()
{
A a;
true ? a : A();
return 0;
}
据我所知,三元组会尝试复制a并且应该失败,因为复制构造函数是显式的,但是gcc编译它就好并创建一个副本.Clang按预期吐出错误.
这是gcc中的错误吗?
我在c ++ 17模式下使用gcc 8.1和clang 7.0,但我也在c ++ 98模式的编译器资源管理器中尝试了所有版本的gcc ,它们的行为都相同.
1> StoryTeller ..:
Clang拒绝它是对的,它确实是一个GCC错误.为简单起见,我将引用n4659(最接近C++ 17标准的文档).
首先,由[expr.cond]6指定的示例中条件表达式的类型必须是类型的prvalue A
.
现在,根据[expr.cond]7,强调我的:
在第二个和第三个操作数上执行左值到右值,数组到指针和函数到指针的标准转换.
a
必须能够进行左值到右值的转换.a
在[conv.lval]3.2(再次强调我的)中指定了哪个for
否则,如果T具有类类型,则转换将从glvalue 初始化结果对象.
的副本初始化A
从A
,在任何情况下,应该选择在过载的分辨率的转换构造([over.match.copy]1.1):
T的转换构造函数是候选函数.
并且显式复制构造函数不是转换构造函数([class.conv.ctor]3)
阿非显式复制/移动的构造([class.copy])是一转换构造.
符合标准的C++实现不能接受您编写的格式良好的条件表达式.