intel ++:警告#1563:取一个临时的地址 - 误报?

RED*_*AIR 3 c++ icc

我上了这堂课:

class myClass
{
private:
      struct tm minDate, maxDate;
public:
      myClass();

      struct tm GetMinDate()  {return minDate;};
      struct tm GetMaxDate()  {return maxDate;};
};
Run Code Online (Sandbox Code Playgroud)

和这个函数调用

SetMinMaxDate(struct tm *MinDate, struct tm *MaxDate);
Run Code Online (Sandbox Code Playgroud)

以下代码

myClass myInstance;
SetMinMaxDate(&myInstance.GetMinDate(), &myInstance.GetMaxDate());
Run Code Online (Sandbox Code Playgroud)

效果很好,MSVC 2010和2005没有生成任何警告.但是,如果我使用英特尔C++编译它我得到警告

warning #1563: taking the address of a temporary
Run Code Online (Sandbox Code Playgroud)

根据这个相关的线程

临时对象的生命周期(也称为rvalue)与表达式相关联,并且在完整表达式的末尾调用临时对象的析构函数

SetMinMaxDate复制用指针传递的内容.指针本身不存储.因此,在SetMinMaxDate返回之前,2个临时tm元素应该是有效的.

这段代码中是否存在问题,或者这是英特尔C++的误报?

编辑: 我发现了另一个非常有趣的帖子,说明了这种行为的原因: 为什么将rvalue的地址临时取出是非法的?

Bra*_*don 7

这是一个有效的警告,因为SetMinMaxDate()它不能保证它不会存储该指针供以后使用.并且由于您正在向临时传递指针,如果SetMinMaxDate将其存储以供以后使用,则会出现问题.

警告的另一个原因是,使用声明,可能SetMinMaxDate正在修改通过指针传入的tm结构,并且这样的修改会丢失,因为它是指向临时对象的指针.

SetMinMaxDate 会更好地宣布为:

SetMinMaxDate(const struct tm & MinDate, const struct tm & MaxDate);
Run Code Online (Sandbox Code Playgroud)

在这种情况下不会有警告.在const让编译器知道它不会被修改对象和&表明它是不太可能试图将地址存储供以后使用.


And*_*owl 5

根据C++ 11标准的5.3.1/3段:

一元运算&符的结果是指向其操作数的指针.操作数应为左值或限定ID.[...]

不仅警告是适当的,我更想知道为什么它不是一个错误.你的节目是不正确的,因为临时不是左撇子.也许,MSVC支持这个作为编译器扩展 - 但这个扩展的价值是相当有争议的.