首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在自动类型演绎中g++5要演绎对象而不是initializer_list

为什么在自动类型演绎中g++5要演绎对象而不是initializer_list
EN

Stack Overflow用户
提问于 2015-05-02 21:28:36
回答 1查看 530关注 0票数 7

我最近发现了这样的代码:

代码语言:javascript
复制
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,结果相同)。原因是std::initializer_list,而Foostd::initializer_list AFAIK,这种类型确实应该是(违反直觉的) be .为什么g++5将类型演绎为Foo

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-02 21:34:13

有一个关于C++1z的建议,它为大括号初始化(N3922)实现了新的类型演绎规则,我猜gcc实现了这些规则:

对于直接列表-初始化: 1.对于只有一个元素的带括号的列表,自动扣减将从该条目中推导出; 2.对于具有多个元素的大括号内列表,自动扣减将不正确。 [例子: auto x1 ={ 1,2 };//解密类型(X1)是std::initializer_list auto x2 ={ 1,2.0 };//错误:无法推断元素类型auto x3{ 1,2 };//错误:没有单个元素自动x4 ={3 };//解密类型(X4)是std::initializer_list auto x5{ 3 };//解密类型(X5)是int。 -最终例子]

以下是有关"Unicorn初始化“的新更改的gcc patch

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30007692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档