请考虑以下代码:
#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)进行编译,但它没有& #39; t GCC 4.9.0 (见here)
从进一步的分析来看,似乎是因为p
的类型推断为std::initializer_list
。
例如,如果替换了一行,它就可以工作:
auto p{q};
使用以下行:
decltype(q) p{q};
我不确定哪一个是正确的(即使 GCC 5.1.0 符合我的期望),这就是我在这里问过的原因。<登记/>
期望p
的类型为std::queue<int>
是否正确?
答案 0 :(得分:1)
auto
将{}
推断为std::initializer_list
。 There is a proposed change to fix this defect
较新的gcc和clang实现了提议的解析,而gcc-4.9却没有。
答案 1 :(得分:0)
没有。
{q}
评估为std::initializer_list
。没有什么可以告诉编译器你可能想要别的东西所以自动使用那个。
同样decltype(q)
与decltype({q})
;