自动和复制构造函数:怎么了?
auto and copy constructor: what's wrong?
考虑以下代码:
#include<queue>
#include<type_traits>
int main() {
std::queue<int> q;
auto p{q};
static_assert(std::is_same<decltype(q), decltype(p)>::value, "fail");
}
使用 GCC 5.1.0 编译良好(参见 here) and clang 3.8.0 (see here), but it doesn't with GCC 4.9.0 (see here)。
进一步分析,似乎是因为p
的类型被推导出为std::initializer_list
.
例如,如果替换行:
auto p{q};
用线:
decltype(q) p{q};
我不确定哪个是正确的(尽管 GCC 5.1.0 符合我的期望),这就是我在这里提问的原因。
期望 p
的类型为 std::queue<int>
是否正确?
没有。
{q}
的计算结果为 std::initializer_list
。没有什么可以告诉编译器你可能想要别的东西,所以自动使用那个。
另外decltype(q)
与decltype({q})
不一样;
This is a known defect in the standard that auto
deduces {}
as std::initializer_list
. There is a proposed change to fix this defect.
较新的 gcc 和 clang 实现了提议的解决方案,而 gcc-4.9 没有。
考虑以下代码:
#include<queue>
#include<type_traits>
int main() {
std::queue<int> q;
auto p{q};
static_assert(std::is_same<decltype(q), decltype(p)>::value, "fail");
}
使用 GCC 5.1.0 编译良好(参见 here) and clang 3.8.0 (see here), but it doesn't with GCC 4.9.0 (see here)。
进一步分析,似乎是因为p
的类型被推导出为std::initializer_list
.
例如,如果替换行:
auto p{q};
用线:
decltype(q) p{q};
我不确定哪个是正确的(尽管 GCC 5.1.0 符合我的期望),这就是我在这里提问的原因。
期望 p
的类型为 std::queue<int>
是否正确?
没有。
{q}
的计算结果为 std::initializer_list
。没有什么可以告诉编译器你可能想要别的东西,所以自动使用那个。
另外decltype(q)
与decltype({q})
不一样;
This is a known defect in the standard that auto
deduces {}
as std::initializer_list
. There is a proposed change to fix this defect.
较新的 gcc 和 clang 实现了提议的解决方案,而 gcc-4.9 没有。