gpt4 book ai didi

c++ - "Reference qualifier correctness"还是应该将非常量方法应用于右值?

转载 作者:行者123 更新时间:2023-11-30 04:17:39 24 4
gpt4 key购买 nike

现在 GCC 4.8.1 和 Clang 2.9 及更高版本支持它们,引用限定符(也称为 "rvalue references for *this")已变得更加广泛可用。它们允许类的行为更像内置类型,例如,不允许对右值进行赋值(否则会导致不希望的将右值转换为左值):

class A
{
// ...

public:
A& operator=(A const& o) &
{
// ...
return *this;
}
};

通常,调用右值的 const 成员函数是明智的,因此左值引用限定符不合适(除非右值限定符可用于优化,例如移动一个类的成员而不是返回一个拷贝)。

另一方面,变异运算符(例如预递减/递增运算符)应该是左值限定的,因为它们通常返回对象的左值引用。因此还有一个问题:除了概念上仅是未标记为 const,因为代码库中忽略了常量正确性(包括使用内部缓存时正确应用 mutablewhich may include ensuring certain thread-saftey guarantees now)?

澄清一下,我并不是建议在语言层面禁止右值的变异方法(至少这可能会破坏遗留代码)但我相信默认(作为习惯用法/编码风格)只允许左值变异方法通常会导致更清洁、更安全的 API。但是,我对不这样做会导致更清洁的示例感兴趣,less astonishing API。

最佳答案

如果 R 值用于完成某些任务,则对 R 值进行操作的增变器可能很有用,但在此期间它会保持某些状态。例如:

struct StringFormatter {
StringFormatter &addString(string const &) &;
StringFormatter &&addString(string const &) &&;
StringFormatter &addNumber(int) &;
StringFormatter &&addNumber(int) &&;
string finish() &;
string finish() &&;
};
int main() {
string message = StringFormatter()
.addString("The answer is: ")
.addNumber(42)
.finish();
cout << message << endl;
}

通过允许 L 值或 R 值,可以构造一个对象,将其传递给一些修改器,并使用表达式的结果来完成某些任务,而不必将其存储在 L 值中,即使修改器是成员函数。

另请注意,并非所有变异运算符都会返回对自身的引用。用户定义的修改器可以实现他们需要或想要的任何签名。修改器可以使用对象的状态来返回更有用的东西,并且通过作用于 R 值,对象被使用的事实不是问题,因为否则状态将被丢弃。事实上,一个使用对象的状态来产生其他有用的东西的成员函数必须被标记为这样,以便更容易看到何时使用了左值。例如:

MagicBuilder mbuilder("foo", "bar");

// Shouldn't compile (because it silently consumes mbuilder's state):
// MagicThing thing = mbuilder.construct();

// Good (the consumption of mbuilder is explicit):
MagicThing thing = move(mbuilder).construct();

关于c++ - "Reference qualifier correctness"还是应该将非常量方法应用于右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16973015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com