为什么具有const成员的结构是可赋值的

Why is a struct with const members assignable?

本文关键字:结构 赋值 成员 const 为什么      更新时间:2023-10-16

我需要使用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代码中,对于隐式声明的特殊成员函数,在未求值的操作数中进行这样的赋值是可以的,即使如果赋值发生在已求值的操作中,则赋值会被混淆。原因是asignment运算符永远不会被隐式定义,而只是被隐式声明,因此永远不会引起错误。

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