模板类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
,Y
并Z
为其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_type
C++ 14 中的规范略有变化,并且可能会在C++中再次发生变化17.因此,对于不同版本的标准,答案可能会有所不同.
众所周知,如果构造函数抛出,则所有完全构造的子对象将以相反的顺序销毁,包括成员数据和各种基类.但是,析构函数不会被调用非委托构造函数.对于委托构造函数,在输入构造函数体时已构造对象,但构造仍在继续.因此,如果委托构造函数从其体内抛出异常,则会出现是否调用类的析构函数的问题?
class X
{
public:
X();
X(int) : X() { throw std::exception(); } // is ~X() implicitely called?
~X();
};
Run Code Online (Sandbox Code Playgroud) 我觉得很安静,我必须使用宏_USE_MATH_DEFINES
才能将pi的值输入我的程序.或者我需要在我自己的标题中自己定义它.或者我必须使用提升等等.
它让我感到很恼火,没有标准的c ++标头以可移植的方式定义该常量.是否有任何特殊原因,像pi这样的数学常量不符合c ++标准?它可能是该标准的下一个版本之一吗?
可以X::f()
在下面的代码中使用虚函数
struct X
{
constexpr virtual int f() const
{
return 0;
}
};
Run Code Online (Sandbox Code Playgroud)
是constexpr
吗?
Qt的容器类QList<T>
,QVector<T>
等需要它们的元素类型是可复制.从C++ 11开始,STL容器要求它们的元素类型只能是可复制的或可移动的.为什么Qt容器不支持仅移动元素类型?
shared_mutex
计划用于C++ 17 的课程.并且shared_timed_mutex
已经在C++ 14.(谁知道为什么他们按顺序排列,但无论如何.)然后有一个recursive_mutex
和一个recursive_timed_mutex
自C++ 11.我需要的是一个shared_recursive_mutex
.我是否错过了标准中的某些内容,还是需要再等三年才能获得标准化版本?
如果目前没有这样的设施,那么仅使用标准C++的这种功能的简单(第一优先级)和有效(第二优先级)实现是什么?
该功能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)
有四个地方我可以想象要调用的移动构造函数:
std::move()
函数本身,但可能在返回的引用最终到达的位置.我敢打赌4号,但我不是百分百肯定,所以请解释你的答案.
从N3797开始,swap
除非另有说明,否则C++标准要求容器函数不抛出任何异常[container.requirements.general]
(23.2.1§10).
swap
指定的成员函数不抛出未声明noexcept
?同样的问题适用于专门的非成员swap
重载.
我有以下代码
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参数?
还有其他方法我可以使用积累来完成我想要的而不会作弊太多吗?
有什么区别
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)
应该首选哪一个?