【发布时间】:2019-12-24 20:58:27
【问题描述】:
由于遗留原因,我正在处理的代码中大量使用了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::strings 保存字符串但只与 C 字符串通信,我将非常感谢更详细的解释。
如果你想建议删除 C 字符串 - 这就是我现在正在尝试做的事情。不过我还是想要一个答案。
【问题讨论】:
-
执行
const char* getValue() && = delete;会阻止您执行functionFromOtherLibrary(getAClass().getValue());,这可能是一个完全有效的用例。你确定要这样做吗? -
@NathanOliver 我不能 100% 确定它确实有效。我必须承认,在深入挖掘之后,我对一切都变得不像以前那么确定了。这也是我寻求帮助的原因。
-
假设你有一些像
print(const char * str) { std::cout << str }这样的函数。执行print(getAClass().getValue());就可以了,因为对于print的整个调用,临时文件仍然有效。现在,如果print要存储指针以供以后使用,那么这将是一个问题,因为它将是一个悬空指针。在这里你必须决定你是限制性的,只是说不允许临时工所以你不会有 UB,或者更难得到它,或者你只是陈述你的合同,如果用户忽略它,这是他们的问题。我属于后者。
标签: c++ c++17 c-strings stdstring rvalue