我认为这是MSVC中的有效代码 :
MyClass* pMc = &MyClass();
但是,当我尝试使用原始数据类型做同样的事情时,我收到了编译错误。
int* pInt = &int();
错误:
error C2101: '&' on constant
我有3个问题:
int()
给我一个常数?关于第3个问题:
我不想要做这样的事情:
int i = int();
int* pInt = &i;
如果我正在使用对本地对象的引用(原因无关紧要),我不希望必须两次声明每个对象。这很乏味,很烦人,名字真的很混乱。
答案 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
的指针,该指针将一直持续到表达式结束。