最佳做法是在赋值中使用initializer_list

Jam*_*eas 5 c++ c++11

我已经读过(Bjarne Stroustrup,The C++ Programming Language,6.3.5)关于在初始化变量时使用initializer_list,这样你就没有缩小转换.Bjarne建议仅使用直接列表初始化:

X a1 {v};

X a2 = {v};

X a3 = v;

X a4(v);

其中,只有第一个可以在每个上下文中使用,我强烈建议使用它.它比其他选择更清晰,更不容易出错.

为什么Bjarne只推荐第一个?

为什么不建议在赋值时执行initializer_list(而不是初始化)?或者只是暗示你应该这样做?

a1 = {v};

这是我要问的一个例子吗?为什么不建议使用initializer_list进行赋值(从我可以看出)但建议初始化?通过减少事故中可能缩小的转换似乎是有益的.

char c;
int toobig = 256;
c = 256; //no error, narrowing occurs
c = { toobig }; //narrowing conversion, error
Run Code Online (Sandbox Code Playgroud)

Atu*_*tul -1

以此为例

#include <iostream>

struct foo
{
    explicit foo(int)
    {
        std::cout << "[+] c'tor called\n";
    }

    foo(const foo&)
    {
        std::cout << "[+] copy c'tor called\n";
    }

};

int main()
{

    std::cout << "\ncreating object a\n";
    foo a = foo{1};

    std::cout << "\n\ncreating object b\n";
    foo b{1};

}
Run Code Online (Sandbox Code Playgroud)

编译用g++ main.cpp --std=c++11 -fno-elide-constructors

输出:

creating object a
[+] c'tor called
[+] copy c'tor called

creating object b
[+] c'tor called
Run Code Online (Sandbox Code Playgroud)

首先temporary创建 a,然后a通过调用复制构造函数创建 a。

而在第二个示例中,对象是直接创建的。

有些few cases地方你必须使用()语法而不是{}.

参见Scott Meyers-Effective Modern C++(第7项)`

  • 它不回答作业 (2认同)