草庐IT

c++ - 是否有原因 declval 返回 add_rvalue_reference 而不是 add_lvalue_reference

将类型更改为类型的reference,允许访问该类型的成员而无需创建该类型的实例。lvaluereferences和rvaluereferences似乎都是如此。declval是用add_rvalue_reference而不是add_lvalue_reference实现的,这只是一个约定吗,或者有没有使用add_rvalue_reference更可取的例子?编辑:我想我有点含糊,这些答案都很好,但触及的点略有不同。建议使用两种不同的答案,Howard强调您可以选择您的类型所具有的引用,从而使add_rvalue_reference更加灵活。其他答案强调默认行为会自动选择更自然地反射(r

c++ - 为什么预增量运算符在 C 中给出右值?

在C++中,预增量运算符给出左值,因为返回的是自增对象本身,而不是拷贝。但在C中,它给出了右值。为什么? 最佳答案 C没有引用。在C++中++i返回对i的引用(lvalue)而在C中它返回一个拷贝(增量)。C996.5.3.1/2Thevalueoftheoperandoftheprefix++operatorisincremented.Theresultisthenewvalueoftheoperandafterincrementation.Theexpression++Eisequivalentto(E+=1).‘‘valueof

c++ - 为什么预增量运算符在 C 中给出右值?

在C++中,预增量运算符给出左值,因为返回的是自增对象本身,而不是拷贝。但在C中,它给出了右值。为什么? 最佳答案 C没有引用。在C++中++i返回对i的引用(lvalue)而在C中它返回一个拷贝(增量)。C996.5.3.1/2Thevalueoftheoperandoftheprefix++operatorisincremented.Theresultisthenewvalueoftheoperandafterincrementation.Theexpression++Eisequivalentto(E+=1).‘‘valueof

c++ - 为什么分配给 substr 调用的结果不是编译器错误?

我刚刚发现了最令人困惑的错误,我不明白为什么编译器没有为我标记它。如果我写以下内容:strings="abcdefghijkl";cout编译器对此没有任何问题,并且根据打印出来的内容,赋值语句似乎没有效果。相比之下,s.front()='x';具有改变底层字符串的效果(因为front返回对字符的引用),并且s.length()=4;还具有生成编译器错误的预期效果,提示您不能分配给不是左值的东西,因为length返回一个整数。(嗯,一个size_t反正。)那么...为什么编译器不提示分配给substr调用的结果?它返回一个字符串值,而不是引用,所以它不应该是可分配的,对吧?但是我已经在

c++ - 为什么分配给 substr 调用的结果不是编译器错误?

我刚刚发现了最令人困惑的错误,我不明白为什么编译器没有为我标记它。如果我写以下内容:strings="abcdefghijkl";cout编译器对此没有任何问题,并且根据打印出来的内容,赋值语句似乎没有效果。相比之下,s.front()='x';具有改变底层字符串的效果(因为front返回对字符的引用),并且s.length()=4;还具有生成编译器错误的预期效果,提示您不能分配给不是左值的东西,因为length返回一个整数。(嗯,一个size_t反正。)那么...为什么编译器不提示分配给substr调用的结果?它返回一个字符串值,而不是引用,所以它不应该是可分配的,对吧?但是我已经在

c++ - 三元运算符为什么以及何时返回左值?

长期以来,我一直认为三元运算符总是返回一个右值。但令我惊讶的是,事实并非如此。在下面的代码中,我没有看到foo的返回值和三元运算符的返回值之间的区别。#includeintg=20;intfoo(){returng;}intmain(){inti=2,j=10;foo()=10;//notOk((i 最佳答案 i和j都是glvalues(有关详细信息,请参阅thisvaluecategoryreference)。那么如果你读到thisconditionaloperatorreference我们就到了这一点:4)IfE2andE3ar

c++ - 三元运算符为什么以及何时返回左值?

长期以来,我一直认为三元运算符总是返回一个右值。但令我惊讶的是,事实并非如此。在下面的代码中,我没有看到foo的返回值和三元运算符的返回值之间的区别。#includeintg=20;intfoo(){returng;}intmain(){inti=2,j=10;foo()=10;//notOk((i 最佳答案 i和j都是glvalues(有关详细信息,请参阅thisvaluecategoryreference)。那么如果你读到thisconditionaloperatorreference我们就到了这一点:4)IfE2andE3ar

c++ - 返回类型 '?:'(三元条件运算符)

为什么第一个返回引用?intx=1;inty=2;(x>y?x:y)=100;而第二个没有?intx=1;longy=2;(x>y?x:y)=100;实际上,第二个根本没有编译——“notlvalueleftofassignment”。 最佳答案 表达式没有返回类型,它们有一个类型和-正如最新的C++标准中所知道的-一个值类别。条件表达式可以是左值或右值。这是它的值(value)范畴。(这有点简化,在C++11中我们有左值、xvalue和prvalue。)在非常广泛和简单的术语中,lvalue是指内存中的对象,而rvalue只是一个

c++ - 返回类型 '?:'(三元条件运算符)

为什么第一个返回引用?intx=1;inty=2;(x>y?x:y)=100;而第二个没有?intx=1;longy=2;(x>y?x:y)=100;实际上,第二个根本没有编译——“notlvalueleftofassignment”。 最佳答案 表达式没有返回类型,它们有一个类型和-正如最新的C++标准中所知道的-一个值类别。条件表达式可以是左值或右值。这是它的值(value)范畴。(这有点简化,在C++11中我们有左值、xvalue和prvalue。)在非常广泛和简单的术语中,lvalue是指内存中的对象,而rvalue只是一个