Questions tagged «c++11»

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

2
Lambda作为基类
在Lambdas上玩耍时,我发现了一个有趣的行为,但我并没有完全理解。 假设我有一个struct Overload从2个模板参数派生的,并且有一个using F1::operator();子句。 现在,如果我派生自两个函子,则只能访问F1的operator()(正如我期望的那样) 如果我从两个Lambda函数派生,则不再适用:我也可以从F2访问operator()。 #include <iostream> // I compiled with g++ (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) // // g++ -Wall -std=c++11 -g main.cc // g++ -Wall -std=c++11 -DFUNCTOR -g main.cc // // or clang clang version 3.3 (tags/RELEASE_33/rc2) // // clang++ -Wall -std=c++11 -g main.cc // clang++ …
69 c++  c++11  lambda 

2
如何在Mac Terminal中使用C ++ 11支持编译C ++
我想在Mac Terminal中编译C ++ 11源代码,但失败了。我试过g++ -std=c++11,g++ -std=c++0x,g++ -std=gnu++11和g++ -std=gnu++0x,但毫无效果。终端总是读unrecognized command line option。但是,g++ -std=gnu类似的东西工作正常(当然,C ++ 11源代码无法通过)。 我应该使用哪个选项来打开C ++ 11支持? 顺便说一句,我正在使用的命令行工具已安装在Xcode中,并且我很确定它们是最新的。
69 c++  macos  c++11  terminal  g++ 

2
为什么shared_ptr仅使用一个时,unique_ptr会使用两个模板参数?
双方unique_ptr并shared_ptr接受定制的析构函数他们所拥有的对象上调用。但在的情况下unique_ptr,析构函数作为一个模板参数传递类,而类型shared_ptr的自定义析构函数将被指定为一个模板参数的构造函数。 template <class T, class D = default_delete<T>> class unique_ptr { unique_ptr(T*, D&); //simplified ... }; 和 template<class T> class shared_ptr { template<typename D> shared_ptr(T*, D); //simplified ... }; 我不明白为什么会有这样的差异。有什么要求?

5
为什么std :: map没有const访问器?
std :: map上[]运算符的声明是这样的: T& operator[] ( const key_type& x ); 不是这个原因吗? T& operator[] ( const key_type& x ); const T& operator[] const ( const key_type& x ); 因为这在您每次需要以const方法访问成员映射时都会非常有用。
69 c++  c++11  std 

4
C ++ 11:正确的std :: array初始化吗?
如果我按以下方式初始化std :: array,则编译器会向我发出有关括号丢失的警告 std::array<int, 4> a = {1, 2, 3, 4}; 这样可以解决问题: std::array<int, 4> a = {{1, 2, 3, 4}}; 这是警告消息: missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces] 这只是我的gcc版本中的错误,还是故意做的?如果是这样,为什么?

6
枚举vs constexpr用于类内部的实际静态常量
让我首先说明我的意图。在较早的(C ++)时代,我们将有如下代码: class C { public: enum {SOME_VALUE=27}; }; 然后,我们可以SOME_VALUE在整个代码中将其用作编译时间常数,并且无论编译器看到什么C::SOME_VALUE,它都只会插入文字27。 现在,将代码更改为以下内容似乎是可以接受的: class C { public: static constexpr int SOME_VALUE=27; }; SOME_VALUE从C ++ 11开始,这看起来更加简洁,给出了定义良好的类型,似乎是首选方法。(至少对我来说是SOME_VALUE无法预料的)问题是,这还会导致需要将其置于外部的情况。也就是说,在某些cpp文件中,我们需要添加: constexpr int C::SOME_VALUE; // Now C::SOME_VALUE has external linkage 导致这种情况的原因似乎是在使用const引用时SOME_VALUE,这种情况在C ++标准库代码中经常发生(请参阅此问题底部的示例)。顺便说一下,我正在使用gcc 4.7.2作为我的编译器。 由于这一难题,我不得不回到定义SOME_VALUE为枚举(即旧派)的方式,以避免为某些但不是全部静态constexpr成员变量向cpp文件中添加定义。难道没有什么办法告诉编译器这constexpr int SOME_VALUE=27意味着SOME_VALUE应该仅将其视为编译时常数,而不应将其视为具有外部链接的对象吗?如果看到与它一起使用的const引用,请创建一个临时引用。如果您看到它的地址,那么就需要生成一个编译时错误,因为这是一个编译时间常数,仅此而已。 以下是一些看似良性的示例代码,这些代码使我们需要SOME_VALUE在cpp文件中添加的定义(再次,用gcc 4.7.2测试): #include <vector> class C { public: static constexpr int SOME_VALUE=5; …
69 c++  c++11  constexpr 

1
std :: function如何工作
您知道,我们可以将lambda函数包装或存储到std::function: #include <iostream> #include <functional> int main() { std::function<float (float, float)> add = [](float a, float b) // ^^^^^^^^^^^^^^^^^^^^ { return a + b; }; std::cout << add(1, 2) << std::endl; } 我的问题是std::function,您可以看到它是一个模板类,但是它可以接受任何类型的函数签名。 例如float (float, float)以这种形式return_value (first_arg, second_arg)。 std::function它的结构是什么,如何接受像这样的函数签名x(y,z)以及如何使用它?float (float, float)C ++中是否有新的有效表达式?
69 c++  c++11 

8
我应该从使用boost :: shared_ptr切换到std :: shared_ptr吗?
我想在中启用GCC中对C ++ 0x的支持-std=c++0x。在GCC 4.5(以及不久的4.6)中,我并不一定需要任何当前受支持的C ++ 11功能,但是我想开始习惯它们。例如,在一些我使用迭代器的地方,一种auto类型会很有用。 但是同样,我不需要任何当前支持的功能。目的是鼓励我将新标准的功能纳入我的编程“词汇表”中。 从对C ++ 11支持的了解来看,在GCC中启用它,然后例如通过boost::shared_ptr将使用从切换为std::shared_ptr单独使用,而不是两者混合使用,将其包含进来,是一个好主意吗? PS:我知道这个比较不同口味的好问题,shared_ptr但我想在标准定稿之前就使用哪种更高层次的建议提出建议。换句话说,当像GCC这样的编译器说它支持“实验功能”时,是否意味着我很可能在编译期间遇到奇怪的错误,而这将是主要的时间消耗,并且是StackOverflow上的一些神秘问题的来源? 编辑:我std::shared_ptr之所以决定从此退回,因为我不信任它在GCC 4.5中的支持,如本问题中的例子所示。
69 c++  boost  stl  c++11  shared-ptr 

7
为什么不将nullptr称为NULL?
在C ++ 11中,nullptr关键字被添加为类型更安全的空指针常量,因为先前的NULLas常见定义为0。 标准委员会为什么选择不调用新的空指针常量NULL,或者声明不NULL应该将其声明为#defined nullptr?

1
void_t“可以实现概念”吗?
我正在观看Walter Brown在CppCon2014上有关模板元编程的第二部分,在此期间他讨论了他的新颖void_t<>结构的用法。彼得·索默拉德(Peter Sommerlad)在演讲中问了我一个不太明白的问题。(链接直接指向问题,正在讨论的代码是在此之前直接进行的) 索默拉德问 沃尔特,这是否意味着我们实际上可以立即实施精简概念? 沃尔特回应 哦耶!我已经完成了...它没有完全相同的语法。 我了解这次交流是关于Concepts Lite。这种模式真的那么通用吗?无论出于什么原因,我都没有看到它。有人可以解释(或素描)这样的样子吗?这仅仅是关于enable_if和定义特征,还是提问者指的是什么? 该void_t模板定义如下: template<class ...> using void_t = void; 然后,他使用它来检测类型语句是否格式正确,并使用它来实现is_copy_assignable类型特征: //helper type template<class T> using copy_assignment_t = decltype(declval<T&>() = declval<T const&>()); //base case template template<class T, class=void> struct is_copy_assignable : std::false_type {}; //SFINAE version only for types where copy_assignment_t<T> is well-formed. template<class T> …

3
这是std :: ref行为逻辑上的吗?
考虑以下代码: #include <iostream> #include <functional> int xx = 7; template<class T> void f1(T arg) { arg += xx; } template<class T> void f2(T arg) { arg = xx; } int main() { int j; j=100; f1(std::ref(j)); std::cout << j << std::endl; j=100; f2(std::ref(j)); std::cout << j << std::endl; } 执行时,此代码输出 …
68 c++  c++11  ref 


4
在C ++ 11中对齐内存的推荐方法是什么
我正在研究单生产者单消费者环形缓冲区实现,我有两个要求: 将单个分配的环形缓冲区实例与缓存行对齐。 将环形缓冲区中的字段与高速缓存行对齐(以防止错误共享)。 我的课看起来像这样: #define CACHE_LINE_SIZE 64 // To be used later. template<typename T, uint64_t num_events> class RingBuffer { // This needs to be aligned to a cache line. public: .... private: std::atomic<int64_t> publisher_sequence_ ; int64_t cached_consumer_sequence_; T* events_; std::atomic<int64_t> consumer_sequence_; // This needs to be aligned to a cache …

1
没有“右值引用*此”功能的解决方法
我在可移动对象周围有一个代理容器类,并希望该代理能够隐式地产生对基础对象的右值引用,但仅当代理自身被移动时才是如此。 我相信我将能够按照建议n2439 “将移动语义扩展到* this”来实现此行为,但是它在gcc发行版中尚不可用,并且将有一段时间。 下面的代码是我最终的目标,但是目前无法实现。在我可以使用此功能之前,是否有任何等效的解决方法? template< class T > struct movable_proxy { operator T&&() && { return std::move(value); } operator const T&() const& { return value; } private: T value; };


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.