我可以删除对象的右值版本的函数吗?
Can I delete function for an rvalue version of object?
出于遗留原因,我正在处理的代码中有很多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
我不确定这是否:
- 是有效的构造和
- 永远是必要的。我见过很多返回
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;
};
这是否是正确的设计是一个单独的问题 - 但如果你决定它是,这就是你会怎么做。
相关文章:
- 用符号版本替换对函数的所有调用
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 用非纯虚拟版本重载纯虚函数
- 重载模板函数未为特定类型选择正确的版本
- Python 的 exec() 函数的 C++ 版本
- "std::function"的简单版本:函数对象的生存期?
- C++14 及更高版本是否允许 Lambda 函数的默认参数?如果是这样,怎么办?
- 在h文件上内联发布版本并在cpp上实现调试版本的函数
- 我可以删除对象的右值版本的函数吗?
- 传递 const int* 和 int* 时调用重载函数的不同版本(const int* const&/&&)
- 触发的断点(析构函数)与类模板类型是自身的一个版本
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- C++14 强制转换以返回成员函数的类型 - 简洁版本
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 根据运行时参数调用模板函数的不同版本
- 函数的内联版本返回的值与非内联版本不同
- std::bind()中static_cast的函数版本
- 派生类是否需要在基类上声明自己的虚函数版本