我可以删除对象的右值版本的函数吗?

Can I delete function for an rvalue version of object?

本文关键字:函数 版本 删除 对象 我可以      更新时间:2023-10-16

出于遗留原因,我正在处理的代码中有很多const char*的使用。我试图限制这一点,并偶然发现了一些我想知道的事情。我有这样的东西:

class AClass {
public:
const char* getValue() { return _value.c_str(); }
private:
std::string _value;
}

但是这个类现在可以通过复制返回,例如。

AClass getAClass();

我们可能还想将其传递给如下所示的内容:

void functionFromOtherLibrary(const char* value);

现在考虑一下,这可能会导致错误:

functionFromOtherLibrary(getAClass().getValue());

因为中间体有资格在这一点上被销毁。即使上述内容正常,因为它是一个语句,这可能也不会:

const char* str = getAClass().getValue();
functionFromOtherLibrary(str);

所以我在考虑写这样的东西:

class AClass {
public:
const char* getValue() { return _value.c_str(); }
const char* getValue() && = delete;
}

禁止在右值上调用该方法。只是尝试给了我:

error C2560: cannot overload a member function with ref-qualifier with a member function without ref-qualifier

我不确定这是否:

  1. 是有效的构造和
  2. 永远是必要的。我见过很多返回const char*s 的代码,它似乎总是依赖于返回值的对象仍然存在并保存源std::string的事实。

我真的很感激更详细的解释,当代码使用std::string来保存字符串但只与 C 字符串通信时会发生什么。

如果你想建议删除 C 字符串 - 这就是我现在正在尝试做的事情。不过我仍然想要一个答案。

不能使用带有 ref 限定符的函数重载没有 ref 限定符的函数。MSVC错误文本在这一点上很好,很清楚。

但是你可以把引用限定符添加到另一个:

class AClass {
public:
const char* getValue() & { return _value.c_str(); }
const char* getValue() && = delete;
};

这是否是正确的设计是一个单独的问题 - 但如果你决定它是,这就是你会怎么做。