gpt4 book ai didi

c++ - std::is_assignable 和 std::pair

转载 作者:太空狗 更新时间:2023-10-29 20:35:04 24 4
gpt4 key购买 nike

正如预期的那样,以下代码 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使用以下三个编译器。

  • g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
  • clang 版本 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
  • MSVC++ 2017 15.2 26430.6

这是为什么?

最佳答案

  1. is_assignable问的问题是“是否有一个接受这些参数的赋值运算符签名”,而不是“该赋值运算符是否会实际编译”(在标准语言中,它只考虑赋值表达式的直接上下文):

    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
    }
  2. pair的赋值运算符不能默认,因为当该对包含引用时它需要做一些特殊的事情。这意味着需要采取额外的预防措施来确保 is_assignable不会撒谎(例如,确保如果成员类型不可复制赋值,则复制赋值运算符被删除)。该标准直到very recently才强制要求采取此类预防措施。 .

  3. is_assignable<T, T>询问是否 T右值可以分配给 T 右值。这是一个奇怪的问题。

关于c++ - std::is_assignable 和 std::pair<const T, U>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44538913/

24 4 0