assignment-operator相关内容

使用 const 成员分配类

考虑以下代码: struct s{const int id;s(int _id):id(_id){}};//...向量v;v.push_back(s(1)); 我收到一个编译器错误,提示“const int id"不能使用默认赋值运算符. Q1.为什么 push_back() 需要赋值运算符? A1.因为当前的 C++ 标准是这样说的. Q2.我该怎么办? 我不想放弃 co ..
发布时间:2021-11-30 12:31:33 C/C++开发

赋值运算符在派生类中不可用

基类中的赋值运算符在派生类中似乎不可用.鉴于此代码: #include A类{整数值;民众:A&运算符=(整数值){这->值=值;返回 *this;}};B 类:公共 A{};int main(){乙乙;乙 = 0;//不起作用返回0;} GCC 6.4 说: 错误:'operator=' 不匹配(操作数类型为 'B' 和 'int') 发生了什么? 解决方案 当我们自己不 ..
发布时间:2021-11-30 12:31:13 C/C++开发

C/C++ 赋值运算符实现的底层细节.它返回什么?

我是 C++ 世界(还有 C)的新手.并且不知道它的所有细节.但有一件事真的让我很困扰.它是这样的结构:while (a=b) {...} .据我所知,这个魔法是有效的,因为 C 和 C++ 中的赋值运算符会返回一些东西.那么问题来了:它返回什么?这是记录在案的事情吗?它在 C 和 C++ 中的工作方式是否相同.非常感谢有关赋值运算符及其在 C 和 C++ 中的实现(如果有差异)的低级详细信息! ..
发布时间:2021-11-30 12:30:46 C/C++开发

“检查自分配"有什么问题?这是什么意思?

在 Herb Sutter 的书 Exceptional C++ (1999) 中,他在第 10 项的解决方案中有文字: “异常不安全"和“糟糕的设计"齐头并进.如果一段代码不是异常安全的,那通常没问题,可以简单地修复.但是,如果一段代码由于其底层设计而不能成为异常安全的,那几乎总是一个糟糕设计的信号. 示例 1:具有两种不同职责的函数很难使异常安全. 示例 2:以必须检查自赋值 ..

如何在没有 operator=() 的情况下为 const 成员 push_back?

如何在不使用 operator=() 的情况下将 push_back() 推到 C++ std::vector 中,默认定义违反了 const 成员? struct Item {项目(整数值):_值(值){}常量字符_值;}矢量项目;items.push_back(Item(3)); 我想保留 _value 常量,因为它在构造对象后不应该改变,所以问题是如何在不调用 operator=() 的 ..
发布时间:2021-11-30 12:30:30 C/C++开发

分配指向整数的指针

我可以分配一个指向整型变量的指针吗?像下面这样. int *pointer;int array1[25];int addressOfArray;指针 = &array1[0];addressOfArray = 指针; 可以这样做吗? 解决方案 并非没有明确的强制转换,即 addressOfArray = (int) 指针; 还有一个警告: 6.3.2.3 指针 ... 6 任 ..
发布时间:2021-11-30 12:30:22 其他开发

如何在 Rust 中重载赋值操作?

std::ops,但没有什么可用于简单的赋值. 我来自 C++ 背景,那里有复制构造函数和赋值运算符重载为您完成工作.我在 Rust 中需要类似的东西. 解决方案 你不能重载赋值.将变量从一个位置移动到另一个位置是 Rust 所有权语义的核心组成部分,并且是不可覆盖的. 另一个答案建议您自定义实现 Copy 特性.这是没有意义的,因为没有什么可实现的: pub trait C ..
发布时间:2021-11-30 12:30:16 其他开发

将赋值运算符标记为仅左值是否可以提高安全性?

如果T是一个带有默认赋值运算符签名的类类型,那么我们可以这样写: T const &ref = ( T{} = something ); 创建一个悬空引用.但是,带有签名: T &operator=(T t) & 上面带有悬空引用的代码将无法编译.这将防止我们返回指定临时对象的左值的某些情况——不希望出现的情况,因为它们可能导致悬空引用. 有什么理由不这样做吗?我们会禁用赋值运算符的 ..
发布时间:2021-11-30 12:30:06 C/C++开发

为什么 C# 中没有 ||= 或 &&= 运算符?

对于所有逻辑运算符、移位运算符、加法运算符和所有乘法运算符,我们都有等效的赋值运算符. 为什么逻辑运算符被遗漏了?有什么好的技术原因为什么很难吗? 解决方案 为什么逻辑运算符被遗漏了?有什么好的技术原因为什么很难吗? 他们没有.如果需要,您可以执行 &= 或 |= 或 ^= . bool b1 = false;布尔 b2 = 真;b1 |= b2;//表示 b1 = b1 ..

隐式生成的赋值运算符应该是 &ref 资格?

以下代码在 gcc 4.8.1 上编译没有问题: #include 结构体{};int main(){富吧;foo() = 酒吧;foo() = std::move( bar );} 似乎为 foo 隐式生成的赋值运算符不是 & ref-qualified,因此可以在右值上调用.根据标准,这是正确的吗?如果是这样,有什么理由不要求隐式生成的赋值运算符是 & ref-qualified? ..
发布时间:2021-11-30 12:29:41 C/C++开发

const 成员和赋值运算符.如何避免未定义的行为?

我回答了关于 我是否有未定义的行为 (UB)? 没有 UB 的解决方案是什么? 解决方案 您的代码导致未定义的行为. 不仅仅是“未定义,如果 A 用作基类,并且这个、那个或另一个".实际上未定义,总是.return *this 已经是 UB,因为 this 不能保证引用新对象. 具体来说,请考虑 3.8/7: 如果,在一个对象的生命周期之后已经结束并且在存储之 ..
发布时间:2021-11-30 12:29:31 C/C++开发

let 5 = 10 有什么作用?不是赋值操作吗?

如果我说let 5 = 10,为什么5 + 1返回6而不是11? 解决方案 当你说 让 5 = 10 这不是对5的重新定义,而是模式匹配,和你说的时候一样 foo 5 = 未定义... foo 10 ... 如果匹配过,模式就会失败. 在 let 表达式中,匹配是惰性的.这意味着匹配仅在对其绑定的变量进行评估时进行.这允许我们编写类似 let foo = undefine ..

C++ 复制构造构造和赋值问题

这里摘录自“C++ Gotchas"一书第 56 条: 经常看到一个简单的写入的 Y 对象的初始化三种不同方式中的任何一种,好像它们是等价的. Y a( 1066 );Y b = Y(1066);Yc = 1066; 事实上,所有这三个初始化可能会导致在相同的目标代码中生成,但它们不等价.a 的初始化称为直接初始化,它确实正是人们所期望的.这初始化是通过直接调用 Y::Y(int). ..
发布时间:2021-11-30 12:29:14 C/C++开发

C++ 为什么赋值运算符应该返回一个 const ref 以避免 (a=b)=c

我正在阅读一本关于 C++ 的书,更准确地说是关于运算符重载的书. 示例如下: const Array &Array::operator=(const Array &right){//检查自赋值//如果不是自赋值,则进行复制返回 *this;//启用x=y=z} 书中关于返回const ref而不是ref的解释是为了避免诸如(x=y)=z之类的赋值.我不明白为什么我们应该避免这种情况.我 ..
发布时间:2021-11-30 12:29:05 C/C++开发