警告:返回临时引用(来自const)

时间:2017-09-21 11:23:17

标签: c++ temporary

早上好:情况如下

.h文件

extern const std::string void_string_;
extern const int zero_int;

template <typename Class>    
inline const Class& zero() 
{
   // an error message
}

template <>
inline const int& zero<int>()
{
    return zero_int;
}

template <>
inline const std::string& zero<std::string>()
{
    return void_string_;
}

.cpp文件

const std::string void_string_="";
const int zero_int=0;

然后我使用

调用这两个函数
zero<int>()
zero<string>()

现在,编译器给我一个警告

zero<int>()
Warning: returning reference to temporary

好的,我知道,理论上,为什么我会收到警告:当我使用临时引用时。没关系。 我仍然不明白为什么 const int zero_int; 被认为是暂时的。

感谢您的任何澄清。

修改:根据评论中的建议,我编辑了 Class&amp;零模板。虽然最初我不能包含错误代码(因为错误消息是一个函数),我清理它以在此处发布并有效地在过程中我理解错误的原因。 具体来说:

template <typename Class>    
inline const Class& zero() 
{
    std::cout << "No!" << std::endl; // substitutes the original error message
    return zero_int;
}

在代码行中发生错误,我调用

zero<long long int>() 

有效地创造了一个临时的。尝试:

template <typename Class>    
inline const Class& zero() 
{
    std::cout << "No!" << std::endl; // substitutes the original error message
    return (Class&)zero_int;
}

删除警告,但显然会给另一个小小的&#39;问题(即:结果不是0,而是一些随机数,可能与程序读取的其他字节有关)

此时我唯一的改变就是离开Class&amp;零()未定义。

template <typename Class>    
inline const Class& zero(); // left undefined by purpose

以这种方式获得完整错误,例如:

undefined reference to `long long const& zero<long long>()'

当我必须定义正确的专业化时,它会提醒我。

感谢您指出我正确的方向。

0 个答案:

没有答案