微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有统一初始化语法的自动类型推导 c++11 vs c++17

如何解决具有统一初始化语法的自动类型推导 c++11 vs c++17

我试图测试自动类型推导。 Scott Meyers(有效的现代 C++)和 Bjarne Stroustrup 的 C++ 编程语言都提到了这样做

auto val {10};

将推断 val 为“初始化列表”类型。

我读到这在 C++17 中发生了变化,因此如果列表中只有一个元素,那么 auto 将推导出该元素的一种类型。

但是,我通过明确指定 C++11 标准,使用最近的 gcc (v10) 和 clang (V11) 编译器对此进行了测试,但我没有看到预期的行为

auto A {1.0};
std::cout << typeid(A).name();

打印“d”到屏幕

auto A={1.0};
std::cout << typeid(A).name();

将“St16initializer_listIdE”打印到屏幕上。

不管我是否特异都一样

gcc -std=c++11

gcc -std=c++17

和 clang 类似。

我知道它在 C++17 中发生了变化,但是为什么我看不到“旧”行为?还是我误会了?

谢谢

解决方法

为 C++17 引入这一变化的论文——https://wg21.link/n3922——有这样的声明:

EWG 的指示是我们认为这是 C++14 中的一个缺陷。

如果某处存在缺陷,则意味着可以追溯应用该论文,因此为以前的标准编译的未来编译器将表现出行为。这就是为什么您看不到旧行为的原因。

如果在修复此缺陷之前使用较旧的编译器进行编译,则可以看到推导出的类型为 std::initializer_list<double>: https://godbolt.org/z/GrnrTE 。 而如果您将编译器更改为更新的版本(例如 g++ 10.2),您可以看到推导出的类型为 doublehttps://godbolt.org/z/r5G945

,

auto A { 1.0 };

你有 direct initialization,将使用封闭表达式的类型来推断类型。

本质上等同于

auto A = 1.0;

另一方面

auto A = { 1.0 };

copy list initialization,与 auto 结合使用时:

type deduction using the keyword auto 有一个特殊的例外,它在复制列表初始化中将任何花括号初始化列表推导出为 std::initializer_list

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。