问题标签 [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.

0 投票
1 回答
203 浏览

c++ - 从右值引用限定的成员函数按值或按右值引用返回?

Effective Modern C++的第 12 条中,Scott Meyers 编写了以下类来展示在引用限定符上重载成员函数是多么有用:

这似乎很清楚: nownon_temp_obj.data()将调用第一个重载并返回对之后仍然存在的对象成员的引用,而make_temp_obj().data()通过值返回对象的成员,该成员在该表达式完成后立即死亡。

这是我的第一个问题:关于&&重载,考虑到我们按值返回,为什么return std::move(values);不只是?return values;

然而,在勘误表中,迈耶斯写道

让成员函数的右值引用重载data返回一个右值的更好方法是让它返回一个右值引用。这将避免为返回值创建临时对象,并且与data第 84 页顶部附近的原始接口的按引用返回一致。

我解释为建议改变

但我不明白原因,特别是鉴于这个答案几乎让我相信这本书的版本是正确的,而勘误表是错误的。

所以我的第二个问题是:谁是对的?

0 投票
1 回答
106 浏览

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;在这种情况下,我理解“丢弃”的使用,因为该对象具有该功能无法兑现的,因此应该丢弃它以使事情正常工作。constconstconst

但是,对于上面的代码,情况似乎并非如此,据我了解,问题在于与预期A{}的左值相比的右值。doWork() &

来自 GCC 的错误的措辞是错误的还是我误读了它?

0 投票
0 回答
61 浏览

c++ - std::make_[un]signed 复制 cv 但不复制 ref 限定符背后的基本原理是什么

在尝试实现make_signed_with_fallback非整数类型时,我注意到它std::make_[un]signed旨在复制cv而不是ref限定符,我想知道为什么。

我能想到的唯一解释ref是很少需要复制限定符。

不幸的是,似乎没有任何标准机制可以复制cvref限定符从一种类型到另一种类型,我唯一能找到的是type_traits标题中的私有内容(msclanggcc),这让我认为这不是很常见任何一个。

在 SO 上发现了一个关于复制 cv ref 特征的实现的老问题

0 投票
1 回答
116 浏览

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 上,如果这有什么不同的话)

感谢你并致以真诚的问候

0 投票
1 回答
63 浏览

c++ - 为什么运算符重载上的 ref-qualifier 和 cv-qualifier 允许右值赋值?

向运算符添加 ref 限定符将消除进行右值赋值的可能性

例如,用g++ -std=c++14 bar.cpp && ./a.out

会给你

您当然可以通过添加显式来“解决”这个问题&&

输出

但是添加 aconst &也会让你调用+=结构实例。

输出

要“解决”这个问题,const &&必须明确删除

输出

为什么是这样?为什么添加 ref-qualifier 会隐式删除右值分配?但是将 cv 限定符与 ref 限定符一起添加似乎隐式添加了右值赋值?

我确定我在这里遗漏了一些明显的东西。但是 Google-Wan Kenobi 似乎无法帮助我理解。

0 投票
1 回答
74 浏览

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

哪个编译器在这里?