我有一个类包含我希望经常使用的数据,所以我认为最好返回一个对它的 const 引用。但是,给定一些参数,我可能需要动态创建新数据。我已经看到您可以将临时返回到常量引用,如下所示:
class Foo {
public:
Foo() { ... } //Initialize data
LARGE_DATA getData(bool param1, bool param2) {
if (...) { // For some crazy function of the parameters
LARGE_DATA newData = ...; // Create new data and return it
return newData
}
return data; // Usually, will just use the default value
}
private:
LARGE_DATA data;
};
void bar() {
Foo f;
const LARGE_DATA& data = f.getData();
... // Process data (read-only)
}
但这似乎会复制data
. 我想做这样的事情:
class Foo {
public:
Foo() { ... } //Initialize data
const LARGE_DATA& getData(bool param1, bool param2) {
if (...) { // For some crazy function of the parameters
LARGE_DATA newData = ...; // Create new data and return it
return newData
}
return data; // Usually, will just use the default value
}
private:
LARGE_DATA data;
};
void bar() {
Foo f;
const LARGE_DATA& data = f.getData();
... // Process data (read-only)
}
这样可以避免不必要的副本。Visual Studio 不会抱怨这一点,但 g++ 会抱怨(而且可能是正确的)。这样做的正确方法是什么?