【发布时间】:2013-02-19 16:00:38
【问题描述】:
以下代码使用 clang (libc++) 编译,使用 gcc (libstdc++) 编译失败。为什么 gcc (libstdc++) 抱怨初始化列表?我以为 return 参数使用的是统一的初始化语法。
std::tuple<double,double> dummy() {
return {2.0, 3.0};
}
int main() {
std::tuple<double,double> a = dummy();
return 0;
}
错误:第 22 行:从初始化程序转换为“std::tuple”\ list 将使用显式构造函数'constexpr std::tuple<_t1 _t2>::tuple(_U1&\ &, _U2&&) [with _U1 = double; _U2 = 双倍; =无效; _T\ 1 = 双倍; _T2 = 双]'
注意: GCC (libstdc++)(和 clang (libc++))接受
std::tuple<double,double> dummy {1.0, 2.0};
不也是一样吗?
更新:这是一个 libc++ 扩展,请参阅 http://llvm.org/bugs/show_bug.cgi?id=15299 并在下面由 Howard Hinnant 回答。
【问题讨论】:
-
只是评论你的最后一个问题:不,情况不同。 return 语句是“复制初始化”上下文,而您的最后一个示例实际上是“直接初始化”。两者的区别在于复制初始化只考虑非显式构造函数。
-
Visual Studio 14 Update 3 也接受它。