在C++14标准(n3797)中,关于左值到右值转换的部分如下所示(我强调的部分): 4.1 左值到右值转换[conv.lval] 1. 非函数、非数组类型T的glvalue(3.10)可以转换为prvalue。如果T是不完整类型,则需要进行此转换的程序是不良形式的。如果T是非类类型,则p...
我有三个函数调用,我认为它们应该被视为(大约)相同的,但显然它们并不是。我正试图理解为什么其中一个无法编译(g ++ -std = c ++ 0x)。 // Minimal example to reproduce a compile bug I want to understand. #...
我正在编写符合此标准的C语言编译器,如果我解析以下这样的语句: int i; (i) = 1; 我的编译器报告了一个错误,指出(i)是rvalue,不应该被赋值。 我检查了代码和规则,并发现以下内容: 在赋值表达式语义中: 赋值运算符的左操作数必须是可修改的lvalue。 赋值表达...
我在互联网上阅读了很多内容,许多人提到以下规则(但我在标准中找不到): 加法运算符+ (以及所有其他二元运算符) 要求两个操作数都是rvalue,并且结果也是rvalue。 我查看了C++标准,并且它明确规定(clause 3.10/2): 无论何时glvalue出现在期望prvalue...
class Test { public: int n1; }; Test func() { return Test(); } int main() { func() = Test(); } 这对我来说没有意义。为什么会被允许?这是未定义的行为吗?如...
我在网上看到的关于左值到右值转换的示例几乎都涉及基本类型,比如int等。 我自己没有找到适用于类类型的l2r示例;在所有看似适用的示例中,通常涉及一个函数,该函数采用左值引用(例如拷贝构造函数),对于这些函数,似乎抑制了l2r转换(请参见例如此问题)。 然而,在l2r本身的描述中,有一个与...
在评估void表达式时,是否需要C实现忽略发生的未定义行为,就好像评估本身从未发生过一样? 考虑C11,6.3.2.2 §1: 如果将任何其他类型的表达式作为void表达式进行评估,则其值或指示符被丢弃。(评估void表达式是为了其副作用。) 这与常见的防止编译器警告未使用变量的惯用...
我在调用具有不同右值引用类型的重载函数时,遇到了代码中的意外行为。下面的代码片段演示了这个问题: #include <iostream> void foo(int&& x) { std::cout << "int Rvalue: " <...