将指向基元的指针初始化为临时对象

时间:2013-02-12 01:36:52

标签: c++ pointers constructor initialization constants

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

MyClass* pMc = &MyClass();

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

int* pInt = &int();

错误:

error C2101: '&' on constant

我有3个问题:

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

    想要做这样的事情:

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

我认为这可行:

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

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