Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。

6
对静态constexpr char []的未定义引用
我想static const char在班上有一个数组。GCC抱怨并告诉我应该使用constexpr,尽管现在它告诉我这是未定义的参考。如果我将数组设为非成员,则它将进行编译。到底是怎么回事? // .hpp struct foo { void bar(); static constexpr char baz[] = "quz"; }; // .cpp void foo::bar() { std::string str(baz); // undefined reference to baz }


2
安全布尔习语在C ++ 11中过时了吗?
@R的答案。Martinho Fernandes表明,C ++ 11中不赞成使用安全布尔习语,因为可以用一个简单的方法代替它 explicit operator bool() const; 根据答案中的标准报价§4 [conv] p3: T当且仅当声明T t=e;的格式正确(对于某些发明的临时变量t(第8.5节))时,表达式e才能隐式转换为类型。某些语言构造要求将表达式转换为布尔值。表达式e出现在这样的背景下被说成是上下文转换到bool和良好成形的当且仅当该声明bool t(e);是良好的形成,对于某些发明临时变量t(第8.5节)。 高亮部分清楚地将“隐式显式强制转换”(在标准中称为“上下文转换”)显示为@R。马丁尼奥说。 要求“隐式显式强制转换”的“某些语言构造”如下所示: if,while,for(§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 [dcl.dcl] p4) noexcept(§15.4 [except.spec] p2) 我们标题中的假设正确吗?我希望我们不要忽视任何潜在的缺点。

3
如何在迭代时从地图中删除?
如何在迭代时从地图中删除?喜欢: std::map<K, V> map; for(auto i : map) if(needs_removing(i)) // remove it from the map 如果我使用map.erase它将使迭代器无效
177 c++  map  c++11 

4
可以在constexpr中使用std :: string吗?
使用C ++ 11,Ubuntu 14.04和GCC默认工具链。 此代码失败: constexpr std::string constString = "constString"; 错误:constexpr变量'constString'的类型'const string {aka const std :: basic_string}'不是字面量...因为...'std :: basic_string'具有非平凡的析构函数 是否有可能使用std::string的constexpr?(显然不是...)如果是这样,怎么办?有没有在字符串中使用字符串的替代方法constexpr?

2
shared_ptr到数组:应该使用它吗?
只是有关的一个小查询shared_ptr。 使用shared_ptr指向数组的好习惯吗?例如, shared_ptr<int> sp(new int[10]); 如果没有,那为什么不呢?我已经知道的一个原因是无法增加/减少shared_ptr。因此,它不能像指向数组的普通指针那样使用。
172 c++  c++11  shared-ptr 

3
std :: atomic到底是什么?
我明白那个 std::atomic<>是一个原子对象。但是原子到什么程度呢?据我了解,操作可以是原子的。使对象原子化的确切含义是什么?例如,如果有两个线程同时执行以下代码: a = a + 12; 那么整个操作(比如说add_twelve_to(int))是原子的吗?还是对变量atomic进行了更改(so operator=())?

2
为什么与普通函数相比,编译器可以更好地优化lambda?
The C++ Standard Library (Second Edition)Nicolai Josuttis 在他的书中指出,与普通函数相比,编译器可以更好地优化lambda。 此外,C ++编译器比常规函数更好地优化了lambda。(第213页) 这是为什么? 我认为在进行内联时,应该不再有任何区别。我能想到的唯一原因是,编译器可能具有更好的lambda本地上下文,这样可以做出更多的假设并执行更多的优化。


5
当operator&重载时,如何可靠地获取对象的地址?
考虑以下程序: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } 我如何获得clyde的地址? 我正在寻找一种适用于所有类型对象的解决方案。C ++ 03解决方案会不错,但我也对C ++ 11解决方案感兴趣。如果可能,让我们避免任何特定于实现的行为。 我知道C ++ 11的std::addressof功能模板,但对在这里使用它不感兴趣:我想了解标准库实现者如何实现此功能模板。

6
C ++ 11、14、17或20是否为pi引入标准常数?
在C和C ++中,数字pi存在一个相当愚蠢的问题。我所知道的M_PImath.h,任何标准都不要求定义。 新的C ++标准在标准库中引入了许多复杂的数学运算-双曲函数std::hermite和std::cyl_bessel_i,不同的随机数生成器等。 是否有任何“新”标准为pi引入常数?如果没有-为什么?没有它,所有这些复杂的数学如何工作? 我知道有关C ++中pi的类似问题(它们已有好几年历史了,并且已经成为标准)。我想知道问题的当前状态。 我也对为什么 C ++仍然没有pi常量但具有很多更复杂的数学的原因非常感兴趣。 UPD:我知道我可以将pi定义为4 * atan(1)或acos(1)或double pi = 3.14。当然。但是为什么在2018年我仍然必须这样做?没有pi的标准数学函数如何工作? UPD2:根据这个在科隆在2019年7月C ++委员会会议之行报告,建议P0631(数学常数)被接纳进入C ++ 20。这样看来,终于在标准库中有了数字pi了!

2
公共朋友交换成员功能
在对复制和交换惯用语的漂亮回答中,有一段代码我需要一些帮助: class dumb_array { public: // ... friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // ... }; 然后他加了一张纸条 还有其他一些主张,我们应该为我们的类型专门使用std :: swap,在提供免费交换功能的同时提供类内交换,等等。但这都是不必要的:对交换的任何正确使用都将通过不合格的调用,我们的功能将通过ADL找到。一种功能会起作用。 随着friend我对“不友好”的条款一点,我必须承认。因此,我的主要问题是: 看起来像一个自由函数,但是它在类体内? 为什么这不是swap静态的?它显然不使用任何成员变量。 “任何正确使用交换的方法都会通过ADL找出交换”?ADL将搜索名称空间,对吗?但是它也可以在类内部查看吗?还是在这里friend进来? 附带问题: 随着C ++ 11,我要记住我的swaps的noexcept? 随着C ++ 11和它的范围,对,我应该将friend iter begin()和friend iter end()在类中以同样的方式?我认为friend这里不需要这个,对吗?

6
在类中使用具有成员函数的通用std :: function对象
对于一个类,我想在一个map存储std::function对象中存储一些指向同一类成员函数的函数指针。但是我在使用此代码的开头就失败了: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; 我收到error C2064: term does not evaluate to a function taking 0 arguments的xxcallobj一些奇怪的模板实例化的错误结合。目前,我在使用Visual Studio 2010/2011的Windows 8上以及在VS10的Win 7上也失败。该错误必须基于一些我不遵循的奇怪C ++规则

3
默认构造函数和析构函数的“ = default”与“ {}”有何不同?
我最初将此问题仅发布为关于析构函数的问题,但现在我添加了对默认构造函数的考虑。这是原始问题: 如果我想给我的类一个虚拟的析构函数,但在其他方面与编译器生成的析构函数相同,则可以使用=default: class Widget { public: virtual ~Widget() = default; }; 但是似乎我可以通过使用空定义进行更少的键入而获得相同的效果: class Widget { public: virtual ~Widget() {} }; 这两种定义有什么不同的表现方式吗? 根据针对该问题发布的答复,默认构造函数的情况似乎类似。既然对于析构函数,“ =default”和“ {}”之间的含义几乎没有差异,那么对于默认构造函数,这些选项之间的含义几乎也没有差异吗?也就是说,假设我要创建一个将同时创建和销毁该类型的对象的类型,为什么我要说 Widget() = default; 代替 Widget() {} ? 如果在发布原始问题后再提出此问题违反了某些SO规则,我深表歉意。为默认构造函数发布一个几乎相同的问题令我震惊,因为它是不太理想的选择。


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.