Tag: c ++ 11

新的C ++返回语法是有限的吗?

我开始了一个新的私人项目,并决定这次使用更多的C ++ 11/14 。 所以我也开始使用新的返回语法 auto functionName() -> returnType; 它大部分工作得很好,但现在我需要一些error handling,并不知道如何重新写这样的东西: virtual const char* what() const noexcept override; 用新的语法。 是否有一些情况下,新的语法不能使用,或者我只是不够聪明,find正确的顺序? 对我来说,保持一致是很重要的,所以我希望这个问题在我这边。

检查是否存在C ++成员函数,可能受保护

我试图检测一个类是否有一个特定的函数(具体来说是std::enable_shared_from_this<Some Unknown Class> shared_from_this() ,它是从std::enable_shared_from_this<Some Unknown Class>inheritance的)。 为了使事情更加复杂,我需要知道它是否具有这个function,即使它是从远处的基类inheritance的,或者是使用受保护的访问inheritance的。 我已经看过其他问题,比如这个 ,但是提供的方法不适用于检测受保护的成员函数。 目前我正在使用的方法如下: template <class T> struct shared_from_this_wrapper : public T { template <class U> static auto check( U const & t ) -> decltype( t.shared_from_this(), std::true_type() ); static auto check( … ) -> decltype( std::false_type() ); }; template<class T> struct has_shared_from_this : decltype(shared_from_this_wrapper<T>::check(std::declval<shared_from_this_wrapper<T>>())) { }; 我目前的解决scheme的缺陷是,它不适用于final宣布的类。 […]

使用OpenMP与C ++ 11基于范围的for循环?

是否有任何相反的迹象表明这样做? 或者是指定的行为? #pragma omp parallel for for(auto x : stl_container) { … } 因为看来OpenMP规范只对c ++ 98有效,但是我猜可能会有更多的不兼容性,因为C ++ 11线程在这里没有使用。 我想确定,仍然。

decltype(“Hello”)的结果是什么?

我收到了所有编译器的意外结果(GCC 4.7.2,GCC 4.8.0 beta,ICC 13.0.1,Clang 3.2,VC10): #include <type_traits> int main() { // This will fire static_assert( std::is_same<decltype("Hello"), char const[6]>::value, "Error!" ); } 我希望上面的编译时间断言不会触发,但它确实如此。 毕竟,这不是(如预期): #include <type_traits> int main() { char const hello[6] = "Hello"; // This will not fire static_assert( std::is_same<decltype(hello), char const[6]>::value, "Error!" ); } 那么根据C ++ 11标准, decltype("Hello")的结果是什么(高度赞赏引用)? 我应该如何比较以便上面的编译时间断言不会触发?

从初始化程序列表初始化std :: tuple

我想知道是否可以通过初始化列表来初始化元组(更确切地说 – initializer_lists的initializer_list)? 考虑元组的定义: typedef std::tuple< std::array<short, 3>, std::array<float, 2>, std::array<unsigned char, 4>, std::array<unsigned char, 4> > vertex; 有没有办法做到以下几点: static vertex const nullvertex = { {{0, 0, 0}}, {{0.0, 0.0}}, {{0, 0, 0, 0}}, {{0, 0, 0, 0}} }; 我只是想实现相同的function,我使用结构,而不是元组(因此只有数组initialize_list初始化): static struct vertex { std::array<short, 3> m_vertex_coords; std::array<float, 2> m_texture_coords; std::array<unsigned char, 4> m_color_1; std::array<unsigned […]

C ++ 11允许vector <const T>吗?

容器需求已经从C ++ 03改为C ++ 11。 虽然C ++ 03具有一揽子要求(例如,向量的复制可构造性和可分配性),但是C ++ 11在每个容器操作(第23.2节)上定义了细粒度的要求。 因此,只要你只执行某些不需要赋值的操作,就可以将一个可复制但不能赋值的types(比如带有const成员的结构)存储在一个向量中(构造和push_back就是这样的操作; insert不)。 我想知道的是:这是否意味着标准现在允许vector<const T> ? 我没有看到任何理由不应该 – const T ,就像一个具有const成员的结构,是一个复制可构造但不可转让的types – 但我可能错过了一些东西。 (使我想我可能错过了一些东西的部分原因是,如果尝试实例化vector<const T> ,gcc trunk将崩溃并烧毁,但对于T有const成员的vector<T>则没有问题。

C + + 11:std ::线程池?

在C ++ 03中,我使用了一个自build线程池的pthread,这个线程池始终保持着一些线程的运行(因为pthread_create比较慢),这样我就可以在不考虑性能问题的情况下为小任务启动线程。 现在,在C ++ 11中,我们有std::thread 。 我想标准没有说具体的实现,所以我的问题是关于标准库的实现。 他们通常select一个合并的方法构buildstd::thread是便宜的(例如,不会在posix上调用pthread_create ),或者将std::thread只是一个包装? 换句话说,在C ++ 11中仍然推荐使用线程池,还是只需要创build一个std::thread并将性能提高到标准库?

为什么std :: declval添加引用?

std::declval是一个编译时间实用程序,用于构buildexpression式以确定其types。 它是这样定义的: template< class T > typename std::add_rvalue_reference<T>::type declval() noexcept; 这不是更简单吗? template< class T > T declval() noexcept; 引用返回types的优点是什么? 不应该叫做declref ? 我发现的最早的历史例子是n2958 ,它调用函数的value()但总是返回一个引用。 注意, decltype的操作数不需要有一个可访问的析构函数,也就是说,它不是在语义上被检查为一个完整的expression式。 template< typename t > t declprval() noexcept; class c { ~ c (); }; decltype ( declprval< c >() ) * p = nullptr; // OK

auto &&做什么?

这是来自Scott Meyers的C ++ 11 Notes Sample的代码, int x; auto&& a1 = x; // x is lvalue, so type of a1 is int& auto&& a2 = std::move(x); // std::move(x) is rvalue, so type of a2 is int&& 我无法理解auto&& 。 我有一些auto理解,从中我会说, auto& a1 = x应使types的a1作为int& 从引用代码,这似乎是错误的。 我写了这个小代码,在gcc下运行。 #include <iostream> using namespace std; int main() { int x […]

为什么在const成员结构中需要一个构造函数?

我有一个类似这样的代码: class AClass { public: struct AStruct { }; AClass(){} private: const AStruct m_struct; }; int main() { AClass a; } 它会抛出这个编译错误(与Clang LLVM版本5.1): error: constructor for 'AClass' must explicitly initialize the const member 'm_struct' 如果我为struct AStruct指定一个C ++ 11默认的构造struct AStruct ,我得到相同的错误: struct AStruct { AStruct() = default; }; 但是,这是通过写一个空构造的构造函数来解决的: struct AStruct { AStruct(){} // fixed }; […]