问题标签 [ref-qualifier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 从右值引用限定的成员函数按值或按右值引用返回?
在Effective Modern C++的第 12 条中,Scott Meyers 编写了以下类来展示在引用限定符上重载成员函数是多么有用:
这似乎很清楚: nownon_temp_obj.data()
将调用第一个重载并返回对之后仍然存在的对象成员的引用,而make_temp_obj().data()
通过值返回对象的成员,该成员在该表达式完成后立即死亡。
这是我的第一个问题:关于&&
重载,考虑到我们按值返回,为什么return std::move(values);
不只是?return values;
然而,在勘误表中,迈耶斯写道
让成员函数的右值引用重载
data
返回一个右值的更好方法是让它返回一个右值引用。这将避免为返回值创建临时对象,并且与data
第 84 页顶部附近的原始接口的按引用返回一致。
我解释为建议改变
到
但我不明白原因,特别是鉴于这个答案几乎让我相信这本书的版本是正确的,而勘误表是错误的。
所以我的第二个问题是:谁是对的?
c++ - 在临时对象上调用 lvalue-ref 限定成员函数时 GCC 错误消息的措辞
预期以下代码无法编译:
我的理解是临时A{}
不能绑定到&
-qualified 成员函数,这似乎与cppreferencedoWork
的摘录一致(我的斜体):
[…] 类 X 的成员函数处理如下:
- 没有引用限定符:隐式对象参数具有对 cv 限定 X 的类型左值引用,并且还允许绑定右值隐式对象参数
- lvalue ref-qualifier:隐式对象参数具有对 cv-qualified X 类型的左值引用,并且不允许绑定右值隐式对象参数
- rvalue ref-qualifier:隐式对象参数具有对 cv 限定 X 的类型 rvalue 引用
我在 Vim 中使用的也clangd
告诉我
this
成员函数“ ”的“ ”参数doWork
是右值,但函数具有非const
左值引用限定符 deleteme.cpp:2:10:注意:“doWork
”在此处声明 [member_function_call_bad_ref]
但是,当我使用 GCC 进行编译时,会出现以下错误:
这似乎与来自错误的错误无关clangd
。
另一方面,当错误地在object上调用非成员函数时,我已经阅读了这两个词, discards qualifiers;在这种情况下,我理解“丢弃”的使用,因为该对象具有该功能无法兑现的,因此应该丢弃它以使事情正常工作。const
const
const
但是,对于上面的代码,情况似乎并非如此,据我了解,问题在于与预期A{}
的左值相比的右值。doWork() &
来自 GCC 的错误的措辞是错误的还是我误读了它?
c++ - std::make_[un]signed 复制 cv 但不复制 ref 限定符背后的基本原理是什么
c++ - 带有 ref-qualifier 的 getter 的最佳实践
以下代码导致未定义的行为:
(因为我的理解是延长寿命const&
在这里不适用)。
为了防止这种情况,一种解决方案可能是添加一个引用限定符get()
以防止它在 LValues 上被调用:
但是,由于现在的函数既是合格的const
,&
所以仍然可以调用get()
RValues,因为它们可以分配给const&
:
防止这种情况(据我所知)的唯一方法是使用不返回引用get()
的-qualified 变体重载,或者重载它:&&
= delete
但是,这意味着要实现正确返回 (const) 引用的 getter 函数,我总是必须提供 Var。1 oder 2.,这相当于很多样板代码。
所以我的问题是:是否有更好/更精简的方法来实现返回引用的 getter 函数,以便编译器可以识别/防止提到的 UB 案例?还是我对问题的理解存在根本缺陷?
另外,到目前为止,我还没有找到一个例子,在不处理重载的情况下添加&
到const
成员函数会带来任何好处&&
......也许任何人都可以提供一个,如果存在的话?
(我在使用 C++17 的 MSVC 2019 v142 上,如果这有什么不同的话)
感谢你并致以真诚的问候
c++ - 为什么运算符重载上的 ref-qualifier 和 cv-qualifier 允许右值赋值?
向运算符添加 ref 限定符将消除进行右值赋值的可能性
例如,用g++ -std=c++14 bar.cpp && ./a.out
会给你
您当然可以通过添加显式来“解决”这个问题&&
输出
但是添加 aconst &
也会让你调用+=
结构实例。
输出
要“解决”这个问题,const &&
必须明确删除
输出
为什么是这样?为什么添加 ref-qualifier 会隐式删除右值分配?但是将 cv 限定符与 ref 限定符一起添加似乎隐式添加了右值赋值?
我确定我在这里遗漏了一些明显的东西。但是 Google-Wan Kenobi 似乎无法帮助我理解。
c++ - 在 C++ 中用带有 ref-qualifier 的子成员函数重载没有 ref-qualifier 的父成员函数
在 C++ 中,不能在一个类中重载具有 ref-qualifier 的成员函数和没有 ref-qualifier 的成员函数。但同时可以从父类继承一个成员函数并在子类中重载它,如示例所示:
只是在调用的过程中f
,铿锵抱怨道call to member function 'f' is ambiguous
。但是GCC接受程序没有任何错误,demo:https ://gcc.godbolt.org/z/5zzbWcs97
哪个编译器在这里?