赋值运算符和临时运算符
Assignment operator and a temporary
我目前正在使用 VS2012,并且预计此代码中的语句 B 会失败,因为我们正在向 foo 类中的赋值运算符方法传递一个常量。 令人惊讶的是,这并没有失败,为什么呢?语句 A 失败,这很好。为什么语句 B 不失败?
struct foo
{
int a;
foo& operator=(foo& that)
{
a=12;
return *this;
}
};
int main()
{
const foo a;
foo b;
//b = a; //statement A
b = foo(); //Statement B
}
这是有效的,因为启用了语言扩展的 VC++ 不符合标准,并且允许将非常量左值引用绑定到临时引用。
在 foo
中添加默认构造函数后,GCC 和 Clang 都会发出相应的错误消息:
主.cpp:18:7:错误:没有可行的重载"="
b = foo(); //Statement B ~ ^ ~~~~~
主.cpp:6:10:注意:候选函数不可行:期望 L 值 对于第一个参数
foo& operator=(foo&) ^
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 为什么初始化时没有调用重载赋值运算符?
- 赋值运算符重载和自赋值
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对 r 值使用移动赋值运算符时的异常
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 默认赋值运算符如何在实际 STL 中实现
- 使用赋值运算符复制 std::vector
- C++ 通过自定义赋值运算符隐式转换函数参数
- 为什么派生类不使用基类运算符=(赋值运算符)?
- 在移动运算符/赋值运算符中,我应该使用std::move还是std::forward