考虑以下程序:
struct X
{
X(int, int) { }
X(X&&) { }
};
int main()
{
X x( {0, 1} ); // Doesn't compile on ICC 13.0.1, compiles on
// Clang 3.2, GCC 4.7.2, and GCC 4.8.0 beta.
}
当使用 GCC 4.7.2、GCC 4.8.0 和 Clang 3.2 编译时,该程序执行以下操作 (*):
- 构造一个临时的类型
X
传递值0
和1
构造函数,然后; X
从那个临时的移动构造。
相反,使用 ICC 13.0.1,它不会编译。
问题1:谁是对的?
(*)实际上,临时的创建和对移动构造函数的调用被省略了,但是使用-fno-elide-constructors
选项编译并向构造函数添加一些打印输出表明这是正在发生的事情。
现在考虑以下,上述程序的轻微变化,其中统一初始化用于直接初始化x
:
int main()
{
X x{ {0, 1} }; // ERROR! Doesn't compile.
// ^........^
}
我不希望在这里使用大括号而不是括号来改变任何东西,但它会以某种方式改变:这个程序不能在我测试过的任何编译器上编译(Clang 3.2,GCC 4.7.2,GCC 4.8。 0 测试版和 ICC 13.0.1)。
问题2:为什么?