【发布时间】:2017-01-19 16:29:23
【问题描述】:
这是最简单的例子:
class A
{
A* const& this_ref;
public:
A() : this_ref(this) {}
};
GCC 5.3.0 给出警告:
警告:临时绑定到 'A::this_ref' 只会持续到 构造函数退出 [-Wextra] A() : this_ref(this) {}
那么this 是临时的吗?什么... MSVC 2015 对此保持沉默,在我的情况下,在构造函数之外通过 this_ref->member 引用类成员会产生预期的行为(但可能只是 UB 的情况,不确定)。
编辑:
请注意,此问题将链接的链接扩展为可能的重复项,因为它不是关于创建此类引用的方式的一般问题,而是关于警告 GCC(以及除 MSVC 之外的其他可能的编译器)在创建引用时产生的警告。
【问题讨论】:
-
由于
this仅在构造函数运行时存在,然后不再存在,因此它是临时的。 (这正是警告告诉你的。) -
你能取
this的地址吗?不要这么想。如果引用对象没有地址,您希望引用如何工作? -
@skypjack 我想这两个问题都是由于对
this指针的误解造成的,但是“可能获得参考……”在阅读 cmets 之前没有任何意义,而且意义不大读完cmets后。此外,这个问题询问特定编译器版本中的特定警告,而链接的问题相当于“我正在尝试用C++11 的特性是因为原因。” -
@KyleStrand 您应该阅读链接问题的答案。无论如何,我不必说服你任何事情。我投票关闭作为重复,我的两分钱,这是权利和义务,所以......
标签: c++ gcc reference this language-lawyer