gpt4 book ai didi

c++ - 为什么具有 const 成员的结构是可分配的?

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:37 24 4
gpt4 key购买 nike

我需要使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com