gpt4 book ai didi

c++ - 应对 C++11 初始化语法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:04 26 4
gpt4 key购买 nike

由于 C++11 引入了新的统一初始化语法,许多人建议使用它来代替旧式语法。至少,如果不是这个所谓的极端情况:

struct Foo {
Foo(int){
std::cout << "default" << std::endl;
}
Foo(std::initializer_list<int>){
std::cout << "initlist" << std::endl;
}
};
int main(){
Foo f{200}; //prints "initlist"
}

使用 {}-always-style 会惹麻烦,尤其是在模板中。新语法似乎只有三种安全用法:

  1. 显式请求 std::initializer_list-constructors
  2. POD 构造函数
  3. 默认构造函数

但也有一种情况我们必须使用统一的初始化语法:非静态数据成员初始化器。由于某种原因,C++可以识别

void Bar() {
Foo f(200);
}

但无法处理

struct Bar {
Foo f(200);
};

问题 #1:为什么 ()-syntax 在函数而不是类中起作用?有谁知道这背后的基本原理?

综上所述,我们最终得出了这个愚蠢的案例:

struct FooBar {
std::vector<int> bar(50); //doesn't work
std::vector<int> bar{50}; //not the intended effect
std::vector<int> bar = std::vector<int>(50); //works
};

当然,您也不能对数据成员使用auto。所以我要么笨拙地混合所有语法,要么根本不使用这些功能。

问题 #2:我是不是误解了什么?这不可能是有意的行为,对吧?

最佳答案

Question #1: Why does the ()-syntax work inside a function but not a class? Does anyone know the rationale behind this?

因为它看起来像一个函数声明,并且已经有足够多的混淆:

Foo f(); // function declaration. This still catches people out

但是您可以使用() ,只需使用复制初始化语法:

T t = T(args);

Question #2: Did I misunderstand something? This can't be intended behavior, can it?

这是设计行为。不幸的是,它不能很好地与某些类型的标准库容器一起使用(例如您的示例中的 std::vector<int>)。你只需要记住一个隐式的 initializer_list构造函数胜过所有其他兼容的构造函数。你应该努力设计你自己的类,这样它们就不会遇到这个问题。

请参阅此相关问题:When to use a brace-enclosed initializer?

关于c++ - 应对 C++11 初始化语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21828031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com