c++ 如何判断列表初始化是否调用了std::initializer_list构造函数?[关闭]

pbgvytdp  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(152)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

3天前关闭。
Improve this question
我的问题是关于C++默认类成员初始化中使用初始化器列表和调用构造函数之间的混淆。
语言中没有歧义,但可能会在开发人员的头脑中造成混淆,导致晦涩的bug。你知道一个好的方法来检测或避免这种混淆吗?
在声明变量时,不会有混淆,因为使用initializer_list和调用构造函数使用不同的语法:

using block = std::vector<int>;
block a{4, 5};  // brackets => initializer list, 2 elements, with values 4 and 5
block b(4, 5);  // parentheses => constructor call, 4 elements, all with value 5

字符串
在默认成员初始值设定项中调用构造函数时使用大括号而不是圆括号。但是,当成员类型接受initializer_list时,这就变得令人困惑了:

class A
{
public:
    A(int size, int value);
};

class C
{
public:
    A     a{4, 5};        // Call constructor A(4, 5)
    block b{4, 5};        // Initializer list, not constructor call, even though same syntax
    block c{block(4, 5)}; // Force a constructor call, but awkward syntax
};


混淆的原因是成员的类型是否接受initializer_list
你知道有什么好办法吗

w8ntj3qf

w8ntj3qf1#

类内成员初始化器也支持=

block b = block(4, 5);

字符串
这比block b{block(4, 5)};稍微好一点。

相关问题