为什么具有const成员的结构是可赋值的
Why is a struct with const members assignable?
我需要使用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中发生了变化,并且您的赋值运算符应该被自动删除,所以在我看来,您的编译器出现了故障。
相关文章:
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何为结构的数据元素赋值
- 复制引用结构上的赋值
- 如何为结构类型变量赋值
- 在结构的构造函数中使用类方法赋值变量
- 为可变结构赋值,该值必须易于复制
- 在 C++ 中使用 initializer_list 进行结构赋值
- C++复制可克隆层次结构中的构造函数和赋值
- C++ 带有指针、赋值和比较的结构
- Arduino结构变量似乎在没有显式重新赋值的情况下被重新赋值
- 如何使用其他函数返回的值为结构体成员赋值
- C++通用数据结构 - 数据字段赋值运算符与复制 C'Tor
- 为结构灵活数组赋值
- 在C++中添加互斥锁后结构中的赋值运算符
- 在C++中为结构赋值
- 包含字符串值的结构在使用动态内存分配创建后进行赋值时会导致分段错误
- 使用类对象为类的结构赋值
- 从C向Obj-C结构赋值
- 如何在此处为联合内部的结构赋值
- 如何为结构赋值