自动和复制构造函数:什么错了?

时间:2016-04-07 12:40:34

标签: c++ c++11 gcc clang auto

请考虑以下代码:

#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>是否正确?

2 个答案:

答案 0 :(得分:1)

{p> This is a known defect in the standard auto{}推断为std::initializer_listThere is a proposed change to fix this defect

较新的gcc和clang实现了提议的解析,而gcc-4.9却没有。

答案 1 :(得分:0)

没有。 {q}评估为std::initializer_list。没有什么可以告诉编译器你可能想要别的东西所以自动使用那个。

同样decltype(q)decltype({q});

不同