【发布时间】:2016-07-28 08:29:38
【问题描述】:
考虑以下代码:
#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)和 clang 3.8.0(参见 here)编译得很好,但它不适用于 GCC 4.9.0(参见here)。
进一步分析,似乎是因为p的类型被推断为std::initializer_list。
例如,如果有人替换该行,它就会起作用:
auto p{q};
随行:
decltype(q) p{q};
我不确定哪个是正确的(尽管 GCC 5.1.0 符合我的预期),这就是我在这里询问的原因。
期望p 的类型为std::queue<int> 是否正确?
【问题讨论】:
-
这是特殊情况。 Mayers 在 C++11/14 的“有效的现代 C++”中写到了这一点。这是由于汽车的特殊类型扣除规则。当自动声明变量的初始化器用大括号括起来时,推导的类型是 std::initial izer_list。如果不能推导出这样的类型(例如,因为大括号初始化器中的值是不同的类型)
-
auto 是 c++11 功能,据我所知,gcc 仅从 5.1 开始完全支持它