编译错误的c++离散解决方案
c++ strage solution to compilation error
查看以下代码:
struct s
{
s& operator+() {return*this;}
};
void foo(s &) {}
s bar() {}
int main()
{
foo(bar()); //comp error
foo(+bar()); //ok
}
我认为main()中的两行应该是等价的,因为编译器优化了away运算符+(),对吧?接受一个而不接受另一个有什么意义?
行foo(bar())
试图将类型为s
(bar()
返回的临时值)的右值绑定到对s
(foo()
的参数)的非const
左值引用。这是非法的,因此产生了编译错误。右值只能绑定到右值引用或const
左值引用。
另一方面,表达式+bar()
返回一个左值引用(即operator + ()
的返回类型),可以绑定到foo()
的左值引用参数。
不过要注意:您在这里返回了一个对临时的左值引用。虽然在foo()
内部使用它仍然是安全的(当创建它的完整表达式完全求值时,临时表达式将被销毁,因此在foo()
返回后),如果您将该引用存储在某个位置并稍后取消引用,则会得到未定义的行为。
因此,与其将此视为"编译错误的解决方案",不如将其视为一种蒙住编译器眼睛的方法,这样您就可以自由地潜入大麻烦中。
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- Dll在同一解决方案中从 c# 项目导入到 c++ 项目