为什么第一个返回引用?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
Run Code Online (Sandbox Code Playgroud)
而第二个不?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
Run Code Online (Sandbox Code Playgroud)
实际上,第二个根本没有编译 - "没有左边的赋值".
我看到整个C++标准中许多地方使用的术语"左值到右值转换".据我所知,这种转换通常是隐含的.
标准中的一个意外(对我来说)特征是他们决定将左值作为转换处理.如果他们说glvalue总是可以接受而不是prvalue怎么办?这句话实际上会有不同的含义吗?例如,我们读到lvalues和xvalues是glvalues的例子.我们没有读到lvalues和xvalues可以转换为glvalues.意义上有区别吗?
在我第一次遇到这个术语之前,我曾经或多或少地对lvalues和rvalues进行了如下建模:"lvalues 总是能够充当rvalues,但另外还可以出现在左侧=和右侧&".
对我来说,这是一个直观的行为,如果我有一个变量名,那么我可以将该名称放在我想放置文字的地方.此模型似乎与标准中使用的左值到右值隐式转换术语一致,只要保证发生此隐式转换即可.
但是,因为他们使用这个术语,我开始想知道在某些情况下是否可能无法进行隐式左值到右值转换.也就是说,也许我的心理模型在这里是错误的.以下是该标准的相关部分:(感谢评论者).
每当glvalue出现在期望prvalue的上下文中时,glvalue就会转换为prvalue; 见4.1,4.2和4.3.[注意:尝试将rvalue引用绑定到左值不是这样的上下文; 见8.5.3 .-结束说明]
我理解他们在说明中描述的内容如下:
int x = 1;
int && y = x; //in this declaration context, x won't bind to y.
// but the literal 1 would have bound, so this is one context where the implicit
// lvalue to rvalue conversion did not happen.
// The expression on right is an lvalue. if it had been a prvalue, it would have bound.
// Therefore, the lvalue …Run Code Online (Sandbox Code Playgroud) 假设您有一个C++函数,它使用(const)参数的更改版本.
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
MyObject const & altered( alter_obj( original ) );
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是正常的,因为临时的寿命延长,因为"最重要的const".如果alter_obj()满足返回值优化的要求,它也是相当有效的,因为RVO意味着不会不必要地复制由值返回的更改对象.
如果你根本没有改变它也会很有效:
void func( MyObject const & original ) {
MyObject const & not_altered( original );
// ...
}
Run Code Online (Sandbox Code Playgroud)
对给定对象的附加引用基本上是免费的,没有制作副本的任何性能开销.
但是说需求会有所改变,并且您希望根据运行时条件选择是否进行更改.天真地,我原本以为使用三元运算符来组合前两种方法将是有效的,在可能的情况下直接绑定原始对象,或者如果不是则绑定临时对象.
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
// ...
MyObject const & …Run Code Online (Sandbox Code Playgroud)