c++ - 为什么具有 const 成员的结构可以赋值?

标签 c++ c++11 type-traits

我需要使用 std::is_assignable 类型特征,而该特征在我想要支持的最旧的编译器版本中恰好不可用。由于我必须自己实现这个(好吧,我承认,有一些互联网偷看),我现在想知道这是我的实现中的错误还是 std::is_assignable 的一般问题。

首先,这是我的测试结构:

struct Bar {
  bool const cb; // this should kill the default assignment operator
  int i;
};

这是我的stdreplace::is_assignable

template <typename T> struct is_assignable : private std::__sfinae_types {
  private:
    template <typename T1> 
      static decltype(std::declval<T1>() = std::declval<T1>(),__one()) test(int);
    template <typename T1> 
      static __two test(...);
  public:
    static bool const value = sizeof(test<T>(0)) == sizeof(__one);
};

但是,它告诉我,Bar 是可分配的:

int: 1
Bar: 1
int[2]: 0

问题出在哪里?

最佳答案

您的编译器可能没有正确地将赋值运算符定义为已删除。在关于隐式声明的特殊成员函数的 c++03 代码中,在未计算的操作数中进行此类赋值是可以的,即使该赋值如果出现在已计算的操作数中则格式不正确。原因是赋值运算符永远不会被隐式定义,而只会隐式声明,因此永远不会引发错误。

由于 c++11 中发生了变化,并且您的赋值运算符应该被自动删除,所以在我看来您的编译器有问题。

关于c++ - 为什么具有 const 成员的结构可以赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9425806/

相关文章:

c++ - 使用 std::is_Detected_exact 检测运算符++签名

c++ - 从结构中引用对象的指针

c++ - 在子类 CStatic 控件中处理 WM_PAINT

c++ - 如何创建不破坏严格别名的 uint8_t 数组?

C++ Type Traits if_v(自动类型推导+确保类型相同)

scala - 在 Scala 中动态选择记录器的实现

c++ - 如何读取二进制文件的全部 64 个字节?

c++ - 从命令行参数指定数组

c++ - 从取消引用的指针返回原始指针

C++11:仿函数的 return_type(对于 std::bind),其中返回类型基于输入类型