自定义类的Static_cast会导致复制赋值失败
static_cast on custom class causes copy assignment to fail
我期望下面的程序打印"11",但它实际上打印"01",所以看起来第一次赋值失败了。
struct A
{
A(int i = 0) : i_(i) {}
int i_;
};
int main()
{
A x(1);
A y;
static_cast<A>(y) = x; // *** Fails to assign ***
std::printf("%i", y.i_);
y = x;
std::printf("%i", y.i_);
}
如果我使用像int
这样的原始类型而不是A
,那么int x = 1; int y; static_cast<int>(y) = x;
确实将值1
分配给x
。是否有一些方法可以让它为自定义类型工作?我尝试将operator A() { return *this; }
添加到struct A
,但没有工作。
显然这是一个愚蠢的程序,但问题出现在模板函数中,我有static_cast<std::remove_const<T>::type>(y) = x
,它对基本类型工作得很好,但现在对自定义类型失败了。
与任何类型转换一样,static_cast<A>(y)
是y
的临时副本。你可以转换为引用类型(static_cast<A&>(y)
);更一般地说,您可以使用std::add_lvalue_reference
来实现这一点。
对于您描述的更具体的示例,您将需要const_cast
而不是static_cast
,但基本原理是相同的。
下面是一个编译的例子,但由于修改了const
对象而有UB(因此返回0
,而不是42
)。在不了解更多您想要做的事情之前,为了这个示例的目的,我不会试图掩饰这一点:
#include <iostream>
#include <type_traits>
template <typename T>
T foo(T val)
{
T x{};
using not_const = typename std::remove_const<T>::type;
using ref_type = typename std::add_lvalue_reference<not_const>::type;
const_cast<ref_type>(x) = val;
return x;
}
int main()
{
std::cout << foo<const int>(42) << 'n';
}
相关文章:
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 如何在双向链表上实现复制赋值?
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 在c++中重载复制赋值运算符
- 复制构造函数和复制赋值运算符是否应具有相同的语句?
- 移动赋值运算符与复制赋值运算符
- Gcc 使用 memcpy 作为隐式复制赋值运算符,而不是成员复制
- 为什么 GCC 拒绝复制赋值操作中的常量引用
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 复制赋值和复制构造函数(代码C++的差异)
- 如何在没有复制赋值运算符的情况下交换两个对象
- 对于具有抛出复制构造函数和noexcept-by-value复制赋值的类,is_nothrow_copy_assigna
- 模拟 C++ 中 lambda 的复制赋值运算符
- 重载复制赋值运算符
- 为什么C++编译器会创建复制构造函数和复制赋值运算符
- 为什么在进行复制赋值之前调用复制构造函数
- 为什么当复制赋值函数不返回任何内容时编译器不引发错误?
- 默认的复制构造函数和复制赋值运算符给出奇怪的错误
- 重载运算符 = 返回 void 是否不可能成为复制赋值运算符