在C++中初始化变量的正确方法是什么?

l'-*_*-'l 4 c++ initialization curly-braces list-initialization

我有以下代码:

bool c (a == b);
Run Code Online (Sandbox Code Playgroud)

bool c {a == b};
Run Code Online (Sandbox Code Playgroud)

其中a和b是一些相同类型的变量.

我想知道,上述两个初始化有什么不同,哪个应该在什么条件下首选?任何形式的帮助将不胜感激.

Max*_*kin 9

两种形式都是直接初始化.

使用大括号{}进行初始化检查以缩小转换,并在发生此类转换时生成错误.不像().(在这方面,gcc是错误的,并且需要-Werror=narrowing编译器选项以在发生缩小时生成错误.)

花括号的另一个用途{}是用于统一初始化:使用相同的语法初始化带有和不带构造函数的两种类型,例如:

template<class T, class... Args>
T create(Args&&... args) {
    T value{std::forward<Args>(args)...}; // <--- uniform initialization + perfect forwarding
    return value;
}

struct X { int a, b; };
struct Y { Y(int, int, int); };

int main() {
    auto x = create<X>(1, 2);    // POD
    auto y = create<Y>(1, 2, 3); // A class with a constructor.
    auto z = create<int>(1);     // built-in type
}
Run Code Online (Sandbox Code Playgroud)

使用花括号{}进行初始化的唯一缺点是它与auto关键字的交互.auto推断{}std::initializer_list,这是一个已知问题,请参阅"自动和支撑初始化列表".

  • @juanchopanza这是一个已知的gcc bug:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 55783 (2认同)