小编Ral*_*zky的帖子

`std :: common_type`是关联的吗?

模板类std::common_type计算可变参数类型列表的公共类型.它是x:y?z递归地使用三元运算符的返回类型定义的.从这个定义来看,对我而言,计算a是否std::common_type<X,Y>是关联的,即是否是,这一点并不明显

using namespace std;
static_assert( is_same<common_type< X, common_type<Y,Z>::type    >::type,
                       common_type<    common_type<X,Y>::type, Z >::type>::value, "" );
Run Code Online (Sandbox Code Playgroud)

不会抛出一个编译时错误,所有类型X,YZ为其is_same<...>表达是有效的.

请注意,我不是在问

static_assert( is_same<common_type<X,Y>::type,
                       common_type<Y,X>::type>::value, "" );
Run Code Online (Sandbox Code Playgroud)

永远都会开火.显然不会.以上是一个完全不同的问题.

另请注意,std::common_typeC++ 14 中的规范略有变化,并且可能会在C++中再次发生变化17.因此,对于不同版本的标准,答案可能会有所不同.

c++ templates types metaprogramming c++11

16
推荐指数
2
解决办法
514
查看次数

委托构造函数抛出时是否调用析构函数?

众所周知,如果构造函数抛出,则所有完全构造的子对象将以相反的顺序销毁,包括成员数据和各种基类.但是,析构函数不会被调用非委托构造函数.对于委托构造函数,在输入构造函数体时已构造对象,但构造仍在继续.因此,如果委托构造函数从其体内抛出异常,则会出现是否调用类的析构函数的问题?

class X
{
public:
    X();
    X(int) : X() { throw std::exception(); } // is ~X() implicitely called?
    ~X();
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor exception c++11

15
推荐指数
2
解决办法
930
查看次数

为什么C++ 11标准中没有常量pi的定义?

我觉得很安静,我必须使用宏_USE_MATH_DEFINES才能将pi的值输入我的程序.或者我需要在我自己的标题中自己定义它.或者我必须使用提升等等.

它让我感到很恼火,没有标准的c ++标头以可移植的方式定义该常量.是否有任何特殊原因,像pi这样的数学常量不符合c ++标准?它可能是该标准的下一个版本之一吗?

c++ pi c++-standard-library c++11

15
推荐指数
1
解决办法
7692
查看次数

虚函数可以是constexpr吗?

可以X::f()在下面的代码中使用虚函数

struct X 
{
    constexpr virtual int f() const 
    {
        return 0;
    }
};
Run Code Online (Sandbox Code Playgroud)

constexpr吗?

c++ virtual-functions constexpr c++11

15
推荐指数
3
解决办法
5175
查看次数

为什么Qt的容器类不允许可移动的,不可复制的元素类型?

Qt的容器类QList<T>,QVector<T>等需要它们的元素类型是可复制.从C++ 11开始,STL容器要求它们的元素类型只能是可复制的或可移动的.为什么Qt容器不支持仅移动元素类型?

qt qlist move-semantics c++11 qvector

14
推荐指数
1
解决办法
1081
查看次数

标准C++中的共享递归互斥锁

shared_mutex计划用于C++ 17 的课程.并且shared_timed_mutex已经在C++ 14.(谁知道为什么他们按顺序排列,但无论如何.)然后有一个recursive_mutex和一个recursive_timed_mutex自C++ 11.我需要的是一个shared_recursive_mutex.我是否错过了标准中的某些内容,还是需要再等三年才能获得标准化版本?

如果目前没有这样的设施,那么仅使用标准C++的这种功能的简单(第一优先级)和有效(第二优先级)实现是什么?

c++ multithreading mutex c++11 c++17

14
推荐指数
3
解决办法
4456
查看次数

何时在`std :: move()`函数中调用移动构造函数?

该功能std::move()定义为

template<typename T>
typename std::remove_reference<T>::type&& move(T && t)
{ 
    return static_cast<typename std::remove_reference<T>::type&&>( t ); 
}
Run Code Online (Sandbox Code Playgroud)

有四个地方我可以想象要调用的移动构造函数:

  1. 参数传递时.
  2. 演员表演时.
  3. 返回结果时.
  4. 不在std::move()函数本身,但可能在返回的引用最终到达的位置.

我敢打赌4号,但我不是百分百肯定,所以请解释你的答案.

c++ rvalue-reference move-semantics c++11

13
推荐指数
1
解决办法
688
查看次数

为什么STL容器中的swap成员函数没有声明为noexcept?

N3797开始,swap除非另有说明,否则C++标准要求容器函数不抛出任何异常[container.requirements.general](23.2.1§10).

  • 为什么swap指定的成员函数不抛出未声明noexcept

同样的问题适用于专门的非成员swap重载.

c++ swap noexcept c++11

13
推荐指数
2
解决办法
506
查看次数

c ++使用move而不是copy进行累积

我有以下代码

auto adder = [](string& s1, const string& s2)->string&&
   {
      if (!s1.empty())
         s1 += " ";
      s1 += s2;
      return move(s1);
   };

   string test;
   test.reserve(wordArray.size() * 10);
   string words = accumulate(wordArray.begin(), wordArray.end(), 
       move(test), adder);
Run Code Online (Sandbox Code Playgroud)

我想在这里避免字符串复制.不幸的是,这并没有通过vs2012的accumulate实现来实现.内部累积调用另一个函数_Accumulate并且rvalue功能在此过程中丢失.

我改为调用_Accumulate函数

string words = _Accumulate(wordArray.begin(), wordArray.end(), 
    move(test), adder);
Run Code Online (Sandbox Code Playgroud)

我获得了预期的性能提升.

是否必须重写std库以考虑rvalue参数?

还有其他方法我可以使用积累来完成我想要的而不会作弊太多吗?

c++ visual-c++

12
推荐指数
1
解决办法
727
查看次数

模板函数与带有自动参数的命名lambda

有什么区别

template <typename T> void func( T t ) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

和使用带有自动参数的lambdas的C++ 14替代方案?

auto func = []( auto t ) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

应该首选哪一个?

c++ lambda templates generic-lambda c++14

11
推荐指数
2
解决办法
1186
查看次数