Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 警告:正在返回对临时文件的引用_C++_Reference - Fatal编程技术网

C++ 警告:正在返回对临时文件的引用

C++ 警告:正在返回对临时文件的引用,c++,reference,C++,Reference,我有一个这样的函数 const string &SomeClass::Foo(int Value) { if (Value < 0 or Value > 10) return ""; else return SomeClass::StaticMember[i]; } 常量字符串&SomeClass::Foo(int值) { 如果(值10) 返回“”; 其他的 return SomeClass::StaticMember[i];

我有一个这样的函数

const string &SomeClass::Foo(int Value)
{
    if (Value < 0 or Value > 10)
        return "";
    else
        return SomeClass::StaticMember[i];
}
常量字符串&SomeClass::Foo(int值) { 如果(值<0或值>10) 返回“”; 其他的 return SomeClass::StaticMember[i]; }
我收到
警告:返回对临时文件的引用
。为什么呢?我认为函数返回的两个值(对const char*“”的引用和对静态成员的引用)不能是临时的。

问题在第一行<代码>“将转换为
std::string
,因为它有一个接受
char*
的有效构造函数。
std::string
将是一个匿名对象,它是临时的,您将返回它的引用。

如Shaggy Frog所说,它将“”转换为临时std::string对象,并且由于您的方法签名是std::string&它尝试返回对它的引用,因此您将得到警告。一种解决方法是按值返回std::string(const std::string SomeClass::Foo(..)。

这是发生不需要的隐式转换时的一个示例<代码>“不是
std::string
,因此编译器试图找到一种方法将其转换为一个字符串。通过使用
字符串(const char*str)
构造函数,它成功地完成了该尝试。 现在已经创建了一个std::string的临时实例,该实例将在方法调用结束时删除。因此,引用方法调用后不再存在的实例显然不是一个好主意


我建议您将返回类型改为<代码> const string < /C> >或存储<代码> >“代码> >代码中的静态变量> SomeClass < /COD> < < /P> < P>这是C++中优化代码的示例。我做到了,每个人都做到了。。。 值得一提的是,这是符合返回值优化条件的经典示例

正如ttvd所说,正确的答案是返回const std::string,而不是对它的引用,并让编译器对其进行优化


如果您相信您喜欢的语言的解释器在您后面优化,您不应该试图对C++过于聪明。

另一个避免的可能性是声明您想要返回的静态值,只使用引用返回< /P>一个好答案!这就是为什么我认为C++不是当今编程挑战的好选择。当你想把注意力集中在手头的问题上时,它会消耗你的时间来关注它的内部运作。@Luis:你想提到的每一种语言都有这些小问题。看来这里需要转换!:P一旦更改为按值返回,常量也应该被删除。@Luis。C++现在是很棒的,然后(当你张贴),而且可能永远!最佳的语言或架构等取决于您的用例。