我上了这堂课:
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的地址临时取出是非法的?
这是一个有效的警告,因为SetMinMaxDate()它不能保证它不会存储该指针供以后使用.并且由于您正在向临时传递指针,如果SetMinMaxDate将其存储以供以后使用,则会出现问题.
警告的另一个原因是,使用声明,可能SetMinMaxDate正在修改通过指针传入的tm结构,并且这样的修改会丢失,因为它是指向临时对象的指针.
SetMinMaxDate 会更好地宣布为:
SetMinMaxDate(const struct tm & MinDate, const struct tm & MaxDate);
Run Code Online (Sandbox Code Playgroud)
在这种情况下不会有警告.在const让编译器知道它不会被修改对象和&表明它是不太可能试图将地址存储供以后使用.
根据C++ 11标准的5.3.1/3段:
一元运算
&符的结果是指向其操作数的指针.操作数应为左值或限定ID.[...]
不仅警告是适当的,我更想知道为什么它不是一个错误.你的节目是不正确的,因为临时不是左撇子.也许,MSVC支持这个作为编译器扩展 - 但这个扩展的价值是相当有争议的.
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |