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

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 没有。