8得票1回答
无确定值的无符号字符类型中,标准中特殊语言在左值到右值转换中的意义是什么?

在C++14标准(n3797)中,关于左值到右值转换的部分如下所示(我强调的部分): 4.1 左值到右值转换[conv.lval] 1. 非函数、非数组类型T的glvalue(3.10)可以转换为prvalue。如果T是不完整类型,则需要进行此转换的程序是不良形式的。如果T是非类类型,则p...

8得票2回答
C++中的rvalue绑定混淆

我有三个函数调用,我认为它们应该被视为(大约)相同的,但显然它们并不是。我正试图理解为什么其中一个无法编译(g ++ -std = c ++ 0x)。 // Minimal example to reproduce a compile bug I want to understand. #...

8得票3回答
标准C语言中,`(i) = 1` 是合法的吗?

我正在编写符合此标准的C语言编译器,如果我解析以下这样的语句: int i; (i) = 1; 我的编译器报告了一个错误,指出(i)是rvalue,不应该被赋值。 我检查了代码和规则,并发现以下内容: 在赋值表达式语义中: 赋值运算符的左操作数必须是可修改的lvalue。 赋值表达...

7得票2回答
关于左值到右值的转换,在什么情况下需要进行?

我在互联网上阅读了很多内容,许多人提到以下规则(但我在标准中找不到): 加法运算符+ (以及所有其他二元运算符) 要求两个操作数都是rvalue,并且结果也是rvalue。 我查看了C++标准,并且它明确规定(clause 3.10/2): 无论何时glvalue出现在期望prvalue...

7得票2回答
将从函数返回的Rvalue分配给另一个Rvalue

class Test { public: int n1; }; Test func() { return Test(); } int main() { func() = Test(); } 这对我来说没有意义。为什么会被允许?这是未定义的行为吗?如...

7得票1回答
lvalue-to-rvalue转换是否会发生在类类型上?

我在网上看到的关于左值到右值转换的示例几乎都涉及基本类型,比如int等。 我自己没有找到适用于类类型的l2r示例;在所有看似适用的示例中,通常涉及一个函数,该函数采用左值引用(例如拷贝构造函数),对于这些函数,似乎抑制了l2r转换(请参见例如此问题)。 然而,在l2r本身的描述中,有一个与...

7得票1回答
void表达式中的未定义行为

在评估void表达式时,是否需要C实现忽略发生的未定义行为,就好像评估本身从未发生过一样? 考虑C11,6.3.2.2 §1: 如果将任何其他类型的表达式作为void表达式进行评估,则其值或指示符被丢弃。(评估void表达式是为了其副作用。) 这与常见的防止编译器警告未使用变量的惯用...

7得票1回答
在调用具有不同右值引用类型的重载函数时,出现了意外的输出。

我在调用具有不同右值引用类型的重载函数时,遇到了代码中的意外行为。下面的代码片段演示了这个问题: #include <iostream> void foo(int&& x) { std::cout << "int Rvalue: " <...