使用后者有缺点吗?是std::make_pair更通用/兼容或者是他们真正的互换?
谢谢!
这是合法的c ++ 0x语法吗?
class A
{
public:
void some_function( const std::set<std::string> &options = {} );
// note that this is legal, which binds the const reference to a temporary:
void some_function( const std::set<std::string> &options = std::set<std::string>() );
}
Run Code Online (Sandbox Code Playgroud)
因为如果是这样,我刚刚在GCC 4.6中发现了一个错误.
我得到的错误是:
错误:在'{'标记之前预期的primary-expression
这是......逻辑......如果它是非法的.
更新:正如@Kerrek所说明的那样,这会渗透到普通的C++ 03中,并带有聚合和旧的大括号初始化语法.为什么这不可能?是否禁止使用标准?或编译器有错?或者这是疏忽吗?我没有看到任何严重的问题,允许它作为明确调用构造函数的替代方法.
我正在尝试在Eclipse CDT Luna 4.4中使用C++ 11统一初始化,以便我可以更容易地发现缩小范围.我有两个问题.第一个是代码样式格式化程序正在将大括号初始化视为有时是一个代码块(例如#2).第二个是,没有赋值运算符的统一初始化给了我编译器错误和警告(例子#4).
我的项目设置为使用"ISO C++ 11(-std = c ++ 0x)"语言标准方言.使用gcc版本4.8.1(GCC).
以下是一些格式示例,每个示例包含代码前后:
示例#1 - 初始化 - 格式正常,没有编译器消息:
int x = {9};
int x = {9};
Run Code Online (Sandbox Code Playgroud)
示例#2 - 赋值 - 格式化程序的"大括号"选项卡上"块"的选项控制"if"语句样式,当"块"设置为"下一行"时,它还会影响以下分配行为.我希望继续使用'下一行'支撑样式(Allman)作为我的'if'语句,而不是将其设置为'Same line'(K&R),这也会停止在此处观察到的新行行为:
int x2;
x2 = {9};
int x2;
x2 =
{ 9};
Run Code Online (Sandbox Code Playgroud)
示例#3 - 没有赋值运算符的初始化 - 格式正常,没有编译器消息:
int y{9};
int y{9};
Run Code Online (Sandbox Code Playgroud)
例4 - 分配不赋值运算符 -格式正常,但是给出了一个expected ';' before '{' token错误,一个statement has no effect [-Wunused-value]编译器警告:
int y2;
y2{9};
int y2;
y2{9};
Run Code Online (Sandbox Code Playgroud)
似乎没有中间立场.使用统一初始化初始化在示例#1和#3中都可以正常工作,但是当在#2和#4中进行赋值时,前者具有格式错误,后者产生编译器消息.
我是C++新手,任何人都有任何建议或在我的逻辑中看到房间里的大象?我得到的印象是,统一初始化不应该用于赋值,因为我没有看到任何这样的例子,但让我感到困惑的是,即使在#2中赋值给出了格式错误,编译器也会 …
我正在使用Visual C++ 2013.当类是聚合时,它是零初始化的.当它是非聚合时,它似乎是默认初始化并且不确定.这是为什么?
#include <iostream>
using namespace std;
class Test_1
{
public:
int i;
void f(){};
};
class Test_2
{
public:
int i;
virtual void f(){};
};
int main()
{
Test_1 t1{};
Test_2 t2{};
cout<<t1.i<<endl; //0
cout<<t2.i<<endl; //-858993460
getchar();
}
Run Code Online (Sandbox Code Playgroud) 相当特殊:
map<bool,int> mb={{1,2},{3,4},{5,0}};
cout << mb.size();
map<int,int> mi={{1,2},{3,4},{5,0}};
cout << mi.size();
Run Code Online (Sandbox Code Playgroud)
打印出来
13
请参阅转发参数时是否应使用()或{}?.foo是一个std::vector克隆.
在N4140中,unique.ptr.create std::make_unique指定如下:
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
备注:除非
T不是数组,否则此函数不应参与重载决策.返回:
unique_ptr<T>(new T(std::forward<Args>(args)...)).
这意味着需要使用实现()而不是{}初始化对象.例如,以下内容
auto s1 = std::make_unique<foo>(3, 1).get()->size();
auto s2 = std::make_unique<foo>(1).get()->size();
auto s3 = std::make_unique<foo>(2).get()->size();
std::cout << s1 << s2 << s3;
Run Code Online (Sandbox Code Playgroud)
输出312,如果{}(内部std::make_unique)使用211将输出.由于无法推导出初始化列表,因此std::initializer_list必须明确传递以获得后者的结果.问题是,为什么不提供像这样的过载?
namespace test
{
template <class T, class Deduce>
std::unique_ptr<T> make_unique(std::initializer_list<Deduce> li)
{
return ::std::make_unique<T>(li);
}
}; …Run Code Online (Sandbox Code Playgroud) 在C++中,当使用initializer_list语法初始化对象时,当没有其他列表初始化规则适用时,对象的常规构造函数也参与重载解析.据我所知,以下代码调用X :: X(int)
class X { int a_; X(int a):a_(a) {} );
void foo() {
X bar{3};
}
Run Code Online (Sandbox Code Playgroud)
但我不明白,为什么常规构造函数也被考虑在initializer_lists的上下文中.我觉得很多程序员现在编写X {3}来调用构造函数而不是X(3)来调用construcor.我根本不喜欢这种风格,因为它让我觉得这个对象没有常规的构造函数.
initializer_list语法也可用于调用常规构造函数的原因是什么?是否有理由比常规构造函数调用更喜欢这种语法?
这真的是声明字节(或字节数组)的最佳方式吗?
static constexpr byte kGuard1_[] = {
byte{0x45}, byte{0x23}, byte{0x12}, byte{0x56}, byte{0x99}, byte{0x76}, byte{0x12}, byte{0x55},
};
Run Code Online (Sandbox Code Playgroud)
为什么没有一些后缀(如 b)可以用来直接将数字标记为字节?或者问题只是因为我使用了统一初始化?
我对 C++11 非常陌生,迭代器和统一初始化存在问题,我不明白。
考虑以下示例,该示例无法编译:
#include <iostream>
#include <vector>
int main() {
std::vector<int> t{1, 2, 3, 4, 5};
auto iter{t.begin()};
for (; iter != t.end(); ++iter) {
std::cout << *iter;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在第 6 行中,使用统一初始化来初始化向量。在第 7 行中,我尝试使用迭代器执行相同的操作。这是行不通的。将第 7 行更改为 就auto iter = t.begin()可以了。我知道我可以简单地使用“基于范围”,但问题是:为什么统一初始化不适用于迭代器,但适用于基本类型,例如int i{0};?
从概念上讲,我认为以下内容并不侵犯隐私。但这是被禁止的。
struct A
{
int a;
int b;
int c;
};
struct B
{
int a;
int b;
private:
int c;
};
int main (int argc, char * argv[])
{
auto a = A{1,2,3}; //ok
auto b = A{1,2}; //ok
auto c = B{1,2,3}; //error
auto d = B{1,2}; //error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
添加手动构造函数将允许对私有成员进行大括号初始化。但聚合和 Pod 的优点在于您需要的编码量很少,因此这很烦人。
另一方面,我认为这是一种隐私侵犯,但这是标准允许的。