【发布时间】:2015-09-06 19:30:23
【问题描述】:
这是一个小例子,展示了一个不清楚的时刻
struct CL
{
CL(){}
CL(int){}
explicit CL(const CL&){}
};
int main() {
CL cl1;
CL cl2=5; //(1)
CL cl3=(CL)5; //(2)
return 0;
}
CL 类具有来自 int 的转换构造函数和标记为显式的复制构造函数。在 (1) case 5 (int) 中隐式转换为 CL,然后 cl2 被直接初始化。在 (2) 情况下 cl3 被复制初始化。在这两种情况下,都必须涉及显式复制构造函数。但是不同的编译器给出不同的结果:
clang 和 VS:第一种情况是正确的,但第二种情况是错误的
gcc: 两种情况都是错误的
我认为 clang 和 VS 是正确的,因为根据标准“显式”关键字可以防止在复制初始化中使用构造函数,但不能在直接初始化中使用构造函数,并且 gcc 是错误的,因为在 (1) 情况下应用了直接初始化.
谁的编译器是对的?
【问题讨论】:
-
Bug 54521,最近修复
标签: initialization c++14 explicit