正如预期的那样,代码为does not compile。
#include <type_traits>
#include <utility>
int main()
{
using T = std::pair<const int, int>;
const auto ok = std::is_assignable<T, T>::value; // true
T x;
T y;
x = y; // compiler error
}
但ok
is true与以下三个编译器的值。
为什么会这样?
答案 0 :(得分:5)
is_assignable
询问“是否存在接受这些参数的赋值运算符签名”,而不是“将赋值运算符实际编译”(在标准中,它只考虑立即上下文<赋值表达式的/ em>:
template<class T>
struct foo {
T t {};
foo& operator=(const foo& r) { t = r.t; };
};
static_assert(std::is_copy_assignable<foo<const int>>::value, ""); // OK
void bar() {
foo<const int> f1, f2;
f1 = f2; // explodes
}
pair
的赋值运算符不能默认,因为当对包含引用时,它需要做一些特殊操作。这意味着需要采取额外的预防措施以确保is_assignable
不存在(例如,如果成员类型不可复制,则确保删除复制赋值运算符)。在very recently之前,该标准没有规定这些预防措施。
is_assignable<T, T>
询问是否可以将T
右值分配给T
右值。这是一个奇怪的问题。