相关疑难解决方法(0)

为什么在初始化列表可用时使用可变参数?

我一直想知道可变参数比初始化列表有什么优点.两者都提供相同的能力 - 将无限数量的参数传递给函数.

我个人认为初始化列表更优雅一些.语法不那么尴尬.

此外,随着参数数量的增加,初始化程序列表似乎具有明显更好的性能.

所以除了在C中使用可变参数的可能性之外我还缺少什么?

c++ performance variadic-functions initializer-list c++11

30
推荐指数
1
解决办法
1万
查看次数

执行std :: initializer_list

我一直在研究如何initializer_list实现,所以我找到了标准的第18.9节,并找到了一个简单的界面.我认为制作我自己命名的版本MyNamespace::InitializerList和用例是有益的:

template<class T>
class ArrayPrinter
{
public:
    ArrayPrinter(MyNamespace::InitializerList<T> list)
    {
        for (auto i : list) cout << i << endl;
    }
};

...

ArrayPrinter ap{ {1,2,3} };
Run Code Online (Sandbox Code Playgroud)

我很惊讶地发现这不起作用,编译器抱怨它找不到合适的构造函数(它想给我3个参数但是第18.9节只描述了一个默认的构造函数).

经过一番摆弄后,我发现我的班级必须完全命名std::initializer_list才能奏效.我还可以别名std::initializer_listMyNamespace,但我不能别名MyNamespace::InitializerListstd::initializer_list.

它似乎不是真正的语言功能,因为它取决于标准库

我的问题的要点是为什么名称如此重要以及它试图传递给构造函数的那3个参数是什么?

c++ initializer-list c++11

19
推荐指数
1
解决办法
3156
查看次数

为什么size不是std :: initializer_list的模板参数?

std::initializer_list 由编译器从大括号括起的init列表构造,并且该列表的大小必须是编译时常量.

那么为什么委员会决定从模板参数中省略大小呢?这可能会阻止一些优化并使一些事情变得不可能(std::array从a 初始化std::initializer_list).

c++ initializer-list c++11

17
推荐指数
2
解决办法
1874
查看次数

为什么必须包含<initializer_list>才能使用auto?

在SO上已经有类似的问题,但我想强调braced-init-lists的另一个方面.考虑以下:

auto x = {1}; //(1)
Run Code Online (Sandbox Code Playgroud)

除非<initializer_list>包含标题,否则这是不正确的(8.5.4/2).但为什么?标准说,模板std::initializer_list不是预定义的.这是否意味着,声明(1)引入了一种新类型?在所有其他情况下,auto可以使用的地方如

auto y = expr;
Run Code Online (Sandbox Code Playgroud)

where expr是表达式,auto deduces类型已经存在.另一方面,从逻辑的角度来看,编译器必须为构造分配一个implicite类型{1},std::initializer_list然后是另一个名称.但是在声明(1)中我们不想命名这种类型.那么为什么必须包括这个标题.有类似的情况nullptr.它的类型隐含存在,但要明确指出它必须包括<cstddef>.

c++ types initializer-list auto c++11

5
推荐指数
1
解决办法
1006
查看次数