我使用cppcheck分析了一些代码,以查找错误和代码质量。我遇到了一个错误,我认为这是一个误报。以下代码示例显示了问题(用注释标记)。
cppcheck - v 1.89
如果我使用括号
编辑:
当我使用
cppcheck - v 1.89
#include <string>
#include <vector>
#include <iostream>
std::string func() {
std::vector<char> data{};
data.push_back('a');
data.push_back('b');
data.push_back('c');
return std::string{ data.data(), data.size() }; // error marked here
// severity: error
// line: 12
// summary: Returning object that points to local variable 'data' that will be invalid when returning.
}
int main() {
std::string ret{};
{
ret = func();
}
std::cout << ret << std::endl;
return 0;
}
如果我使用括号
()
而不是花括号 {}
,就可以解决错误。编辑:
当我使用
()
或 {}
调试示例时,完全没有区别。 我使用带有C++14的Visual Studio 17。
{}
中的内容可以解释为std::initializer_list<char>
,那么你会遇到问题(这个问题可以通过使用()``来解决)。否则,使用
{}是可以的。当不确定该使用哪种方式时(对于具有
std::initializer_list构造函数的类),通常最安全的方法是坚持使用
()``。参考例子:这个答案。 - Sander De Dycker