Questions tagged «initializer-list»

6
在构造函数初始值设定项中初始化成员数组
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; 我相信原因是只能使用=语法来初始化数组,即: int arr[3] = {1,3,4}; 问题 我该怎么做我想做的事情(就是在构造函数中初始化一个数组(而不是在主体中分配元素))。可能吗? C ++ 03标准是否对在ctor初始化程序中初始化聚合(包括数组)有什么特别的建议?还是上述代码的无效性是其他某些规则的必然结果? C ++ 0x初始化程序列表可以解决问题吗? PS:请不要提及向量,boost :: arrays及其对数组的优越性,我很清楚。


8
initializer_list并移动语义
我可以将元素移出std::initializer_list<T>吗? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 由于std::intializer_list<T>需要特别注意编译器并且没有像C ++标准库的普通容器那样的值语义,因此,我宁愿安全而不愿后悔。

6
为什么std :: initializer_list不是内置语言?
为什么没有std::initializer_list内置核心语言? 在我看来,它是C ++ 11的重要功能,但它没有自己的reserved关键字(或类似名称)。 相反,initializer_list它只是标准库中的模板类,它具有由编译器处理的新的braced-init-list语法的特殊隐式映射。 {...} 乍一看,这种解决方案是很棘手的。 现在是通过新的C ++语言实现方式吗:通过某些模板类的隐式角色而不是核心语言? 请考虑以下示例: widget<int> w = {1,2,3}; //this is how we want to use a class 为什么选择新班级: widget( std::initializer_list<T> init ) 而不是使用类似于以下任何想法的东西: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> init ) // (3) 一个经典的数组,您可能会在const这里和那里添加 …

5
我可以对仅移动类型的向量进行列表初始化吗?
如果我通过GCC 4.7快照传递以下代码,它将尝试将unique_ptrs 复制到向量中。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } 显然,这std::unique_ptr是不可操作的,因为不可复制: 错误:使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp,_Dp> = std :: unique_ptr]' GCC在尝试从初始化列表中复制指针时是否正确?

3
何时使用括号括起来的初始化程序?
在C ++ 11中,我们具有用于初始化类的新语法,这为我们提供了许多初始化变量的可能性。 { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex<double> b(3,4); std::complex<double> a{3,4}; std::complex<double> c = {3,4}; auto d = std::complex<double>(3,4); auto e = std::complex<double>{3,4}; } { // Example 3 std::string a(3,'x'); std::string b{3,'x'}; // …


2
C ++ 11初始化程序列表失败-但仅在长度为2的列表上
我找到了一个模糊的日志记录错误,发现长度为2的初始化列表似乎是特例!这怎么可能? 该代码是使用Apple LLVM 5.1版(clang-503.0.40)编译的CXXFLAGS=-std=c++11 -stdlib=libc++。 #include <stdio.h> #include <string> #include <vector> using namespace std; typedef vector<string> Strings; void print(string const& s) { printf(s.c_str()); printf("\n"); } void print(Strings const& ss, string const& name) { print("Test " + name); print("Number of strings: " + to_string(ss.size())); for (auto& s: ss) { auto t …

3
使用一个函数调用C ++初始化多个常量类成员
如果我有两个不同的常量成员变量,都需要基于相同的函数调用进行初始化,是否有一种方法可以在不两次调用函数的情况下进行? 例如,分数类,其中分子和分母是常数。 int gcd(int a, int b); // Greatest Common Divisor class Fraction { public: // Lets say we want to initialize to a reduced fraction Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b)) { } private: const int numerator, denominator; }; 由于两次调用GCD函数,这会浪费时间。您还可以定义一个新的类成员,gcd_a_b然后首先将gcd的输出分配给初始化程序列表中的输出,但这将导致内存浪费。 通常,有没有一种方法可以避免浪费的函数调用或内存?您能否在初始化列表中创建临时变量?谢谢。

6
基于无辜范围的循环无效
以下内容无法编译: #include <iostream> int main() { int a{},b{},c{},d{}; for (auto& s : {a, b, c, d}) { s = 1; } std::cout << a << std::endl; return 0; } 在Godbolt上尝试 编译器错误是: error: assignment of read-only reference 's' 现在,在我的实际情况中,列表由类中的成员变量组成。 现在,这不起作用,因为表达式变为initializer_list<int>实际上复制a,b,c和d的a,因此也不允许修改。 我的问题有两个: 不允许以这种方式编写基于范围的for循环背后有动机吗? 例如。也许会有一些特殊的情况来表达裸括号。 修复此类循环的语法整洁方法是什么? 最好遵循以下方式: for (auto& s : something(a, b, …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.