Des*_*tor 1 c++ auto list-initialization c++14 c++17
考虑以下程序:
#include <iostream>
int main()
{
int n = 3;
int fact = 1;
for(auto i{1};i<=n;i++)
fact*=i;
std::cout<<"fact of "<<n<<" is "<<fact;
}
Run Code Online (Sandbox Code Playgroud)
即使我使用-std=c++14选项,它也可以在ideone上编译.在这里查看现场演示.但是在C++ 14中,变量i应该initializer_list根据此推断出来.
有一个C++ 1z的提议,它为括号初始化实现了新的类型推导规则:
对于直接列表初始化:
对于只包含单个元素的braced-init-list,自动扣除将从该条目中推断出来;
对于具有多个元素的braced-init-list,自动扣除将是不正确的.
[例:
auto x1 = {1,2}; // decltype(x1)是std :: initializer_list
auto x2 = {1,2.0}; //错误:无法推断出元素类型
auto x3 {1,2}; //错误:不是单个元素
auto x4 = {3}; // decltype(x4)是std :: initializer_list
auto x5 {3}; // decltype(x5)是int.
- 结束例子]
所以,规则改变了C++ 17.因此,当我使用时,程序不应该编译-std=c++14.这是g ++中的错误吗?这个变量不应该i像initializer_listC++ 14 那样推断出来吗?
小智 5
有一个C++ 1z的提议,它为括号初始化实现了新的类型推导规则
不完全是.如果您按照实际论文的链接,它会显示:
EWG的方向是我们认为这是C++ 14中的一个缺陷.
这足以使实现者将其视为缺陷,因此即使在C++ 14模式下也会改变编译器行为.
| 归档时间: |
|
| 查看次数: |
551 次 |
| 最近记录: |