【发布时间】:2023-02-22 18:54:17
【问题描述】:
inline string& rtirm(string& s)
{
s.erase(s.find_last_not_of(' ') + 1);
return s;
}
const char* buf = " abc ";
string s_trim = rtirm(string(buf));
在我将 visual studio 升级到 2022 并使用 C++20 之前,这段代码一直运行良好。
错误 C2664 'std::string &rtirm(std::string &)': 无法转换 从 'std::string' 到 'std::string &' 的参数 1
我很清楚原因——引用不能引用临时对象。 但这使代码更加复杂。我必须在调用 trim 之前定义一个变量吗?
string temp{buf}; string s_trim = rtirm(temp);
【问题讨论】:
-
顺便说一句,这与 C++20 标准的变化无关,而是默认情况下较新的编译器更严格。请参阅 /permissive 选项。
-
iirc msvc 允许在某些情况下将临时对象绑定到非常量引用作为非标准扩展,但我不知道任何细节,也没有解释为什么它停止工作。尽管无论如何应该修复代码
-
godbolt.org/z/z9PTbbM55 所以现在 MSVC 的行为与其他编译器一样。注意 warring 已归档,因此如果您将警告视为错误,则在旧版本中它将是相同的。
标签: c++ visual-c++ c++20