7

我最近遇到了这段代码:

struct Foo{};

int main() 
{
    Foo a;
    // clang++ deduces std::initializer_list
    // g++5.1 deduces Foo
    auto b{a}; 
    a = b;
}

它使用 g++5.1 编译良好,但在 clang++ 中失败(同时使用-std=c++11-std=c++14,结果相同)。原因是clang++ 推导出 as 的类型bstd::initializer_list<Foo>g++5.1推导出 asFooAFAIK,这里的类型确实应该是(确实违反直觉)std::initializer_list。为什么 g++5 将类型推断为Foo

4

1 回答 1

13

有一个针对 C++1z 的提案,它为大括号初始化(N3922)实现了新的类型推导规则,我猜 gcc 实现了它们:

对于直接列表初始化:
1. 对于只有一个元素的花括号初始化列表,自动推导将从该条目中推导;
2. 对于一个包含多个元素的花括号初始化列表,自动推导将是非良构的。

[例子:

auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
auto x2 = { 1, 2.0 }; // error: cannot deduce element type
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 }; // decltype(x5) is int. 

--结束示例]

这是关于“独角兽初始化”的新变化的gcc 补丁。

于 2015-05-02T21:34:13.580 回答