Tag: c ++ 11

在lambda中移动捕获

如何通过移动(也称为右值引用)在C ++ 11 lambda中捕获? 我想写这样的东西: std::unique_ptr<int> myPointer(new int); std::function<void(void)> = [std::move(myPointer)]{ (*myPointer) = 4; };

如何正确传递参数?

我是一个C ++初学者,但不是编程初学者。 我正在尝试学习C ++(c ++ 11),对于我来说最重要的事情还不清楚:传递参数。 我考虑了这些简单的例子: 具有所有成员基本types的类: CreditCard(std::string number, int expMonth, int expYear,int pin):number(number), expMonth(expMonth), expYear(expYear), pin(pin) 具有成员基本types的类+ 1复杂types: Account(std::string number, float amount, CreditCard creditCard) : number(number), amount(amount), creditCard(creditCard) Client(std::string firstName, std::string lastName, std::vector<Account> accounts):firstName(firstName), lastName(lastName), accounts(accounts) 当我创build一个帐户,我这样做: CreditCard cc("12345",2,2015,1001); Account acc("asdasd",345, cc); 很明显,在这种情况下信用卡将被复制两次。 如果我重写那个构造函数 Account(std::string number, float amount, CreditCard& creditCard) : number(number) , […]

我如何检查C ++ 11的支持?

有没有办法在编译时检测编译器是否支持C ++ 11的某些特性? 例如,像这样的东西: #ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template <typename… DatatypeList> class Tuple { // … } #endif

在C ++ 11中,安全布尔成语是否过时?

@R的这个答案。 马丁·费尔南德斯(Martinho Fernandes)表示,安全布尔成语在C ++ 11中被明显弃用,因为它可以被简单的 explicit operator bool() const; 根据答案§4 [conv] p3的标准报价: 一个expression式e可以被隐含地转换为一个typesT当且仅当声明T t=e; 对于一些发明的临时variablest (§8.5)来说,是格式良好的。 某些语言结构要求将expression式转换为布尔值。 出现在这样的语境中的expression式e据说被上下文转换为bool , 并且当且仅当声明bool t(e); 对于一些发明的临时variablest(§8.5)来说, 是格式良好的 。 突出显示的部分清楚地显示了“隐式显式强制转换”(在标准中称为“上下文转换”)为@R。 马蒂尼说的。 需要“隐式显式投射”的“某些语言结构”似乎是: if , while ,( §6.4 [stmt.select] p4 ) 二进制逻辑运算符&&和|| ( §5.14 [expr.log.and/or] p1 ) 逻辑否定运算符! ( §5.3.1 [expr.unary.op] p9 ) 条件运算符?: §5.14 [expr.cond] p1 ) static_assert ( §7 […]

何时可以在初始化列表中省略外部大括号?

在编译下面的代码时,我在VC2010中出错C2078。 struct A { int foo; double bar; }; std::array<A, 2> a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::array<double, 2> a2 = {0.1, 2.3}; 我发现a1的正确语法是 std::array<A, 2> a1 = {{ {0, 0.1}, {2, 3.4} }}; 问题是:为什么a1需要额外的大括号,而a2不需要? 更新 这个问题似乎不是特定于std :: array。 一些例子: struct B { int foo[2]; […]

C ++中有符号整数溢出仍然是未定义的行为?

正如我们所知,有符号整数溢出是未定义的行为 。 但在C ++ 11 cstdint文档中有一些有趣的cstdint : 有符号整数types,其宽度分别为8,16,32和64位,没有填充位, 2的补码用于负值 (只有在实现直接支持该types时才提供) 请参阅链接 这里是我的问题:因为标准明确指出,对于int8_t , int16_t , int32_t和int64_t负数是2的补码,仍然是这些types的溢出未定义的行为? 编辑我检查了C ++ 11和C11标准,这里是我发现: C ++ 11,§18.4.1: 标题定义了与C标准中的7.20相同的所有函数,types和macros。 C11,§7.20.1.1: typedef名称intN_t指定宽度为N,无填充位和二进制补码表示的有符号整数types。 因此, int8_t表示宽度恰好为8位的带符号整数types。

使用boost或STL对C ++中的压缩(locking)容器进行sorting

我想做什么:我想sorting2或3,或N个向量,locking在一起, 而不复制到一个元组中。 也就是说,把冗长留在一边,就像: vector<int> v1 = { 1, 2, 3, 4, 5}; vector<double> v2 = { 11, 22, 33, 44, 55}; vector<long> v3 = {111, 222, 333, 444, 555}; typedef tuple<int&,double&,long&> tup_t; sort(zip(v1,v2,v3),[](tup_t t1, tup_t t2){ return t1.get<0>() > t2.get<0>(); }); for(auto& t : zip(v1,v2,v3)) cout << t.get<0>() << " " << t.get<1>() << " […]

什么是std :: move(),什么时候应该使用?

它是什么? 它有什么作用? 什么时候使用? 良好的联系表示赞赏。

C ++是否支持可变长度数组?

不,等等,跟我一起… VLA总是一个GCC扩展,但是它们被C99采用: [C99: 6.7.5.2/4]:如果大小不存在,则数组types是不完整的types。 如果size的大小是*,而不是一个expression式,则数组types是一个非指定大小的可变长度的数组types,它只能在具有函数原型作用域的声明中使用; 这样的数组仍然是完整的types。 如果大小是一个整数常量expression式,并且元素types具有已知的常量大小,则数组types不是可变长度数组types; 否则,数组types是一个可变长度的数组types。 C99也被称为ISO/IEC 9899:1999 。 现在: [C++11: 1.1/2]: C ++是一种基于ISO / IEC 9899:1999(以下简称C标准)规定的C编程语言的通用编程语言。 除了C提供的function之外,C ++还提供额外的数据types,类,模板,exception,命名空间,运算符重载,函数名称重载,引用,免费商店pipe理操作员以及其他库设施。 那么C ++ 11也不应该有VLA吗?

当涉及std :: function或lambda函数时,C ++ 11不会推导出types

当我定义这个函数时, template<class A> set<A> test(const set<A>& input) { return input; } 我可以在代码中的其他地方使用test(mySet)来调用它,而不必显式定义模板types。 但是,当我使用以下function: template<class A> set<A> filter(const set<A>& input,function<bool(A)> compare) { set<A> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; } 当我使用filter(mySet,[](int i) { return i%2==0; }); 我得到以下错误: error: no matching function for call to 'filter(std::set<int>&, […]