0

我认为这是MSVC中的有效代码:

MyClass* pMc = &MyClass();

但是,当我尝试对原始数据类型做同样的事情时,我遇到了编译错误。

int* pInt = &int();

错误:

error C2101: '&' on constant

我有3个问题:

  1. 为什么int()给我一个常数?
  2. 为什么首先存在错误C2101?获取常量的地址有什么问题?
  3. 有没有办法可以声明指向临时对象的 int (或其他原始)引用?(即不先创建局部变量)

关于第三个问题:

不想做这样的事情:

int i = int();
int* pInt = &i;

如果我正在使用对本地对象的引用(原因无关紧要),我不想必须两次声明每个对象。这很乏味,很烦人,而且名字真的很混乱。

4

2 回答 2

4

我不知道 1 的答案(我认为错误是错误的,因为我很确定int()不是常数),但是

(2) 占用临时地址是非法的。您的代码不应该编译,但它确实是因为非标准的 MSVC++ 扩展。

(3) 是的,使用 rvalue-references 或 const lvalue-references:

const int& tmp = int();
int&& tmp = int(); // same as former but isn't const

临时对象的生命周期将延长,直到引用超出范围。

但是,我希望您有充分的理由使用上述两种方法之一,而不是

int tmp;
于 2013-02-12T01:41:44.133 回答
1

代码行在一个编译器中以违反标准的方式编译,但取消引用该指针是下一行的未定义行为。所以要小心。

我认为这可能有效:

template<typename T>
T* make_tmp_ptr(T&&t) {
   return &t;
}

然后调用make_tmp_ptr(int()),您将获得一个指向临时的指针,该指针int将持续到表达式结束。

于 2013-02-12T02:00:48.797 回答