English 中文(简体)
获取临时对象的地址
原标题:Taking the address of a temporary object
  • 时间:2010-02-17 12:51:24
  •  标签:
  • c++
  • rvalue

§5.3.1 一元运算符,第3节

一元运算符&的结果是其操作数的指针。操作数必须是左值或限定符id。

在此情境中,“shall be” 究竟是什么意思?它是否意味着将暂时的地址取出是错误的?我只是想知道,因为 g++ 只给了我一个警告,而 Comeau 拒绝编译以下程序:

#include <string>

int main()
{
    &std::string("test");
}

g++ 警告:取临时变量的地址

Comeau错误:表达式必须是一个lvalue或者一个函数指示符。

请问有人拥有微软编译器或其他编译器,能够测试这个程序吗?

最佳回答

标准语言中的"shall"一词意味着严格的要求。因此,是的,您的代码不正确(它是一个错误),因为它试图对非lvalue应用地址运算符。

然而,这里的问题不是尝试使用临时变量的地址。问题是,再次获取一个非左值的地址。临时对象可以是左值或非左值,这取决于产生该临时对象或提供对该临时对象的访问的表达式。在您的情况下,您有std::string("test")--对非引用类型的函数式类型转换,根据定义产生一个非左值。因此会出现错误。

如果你想获取临时对象的地址,你可以通过以下方式解决限制问题,例如:

const std::string &r = std::string("test");
&r; // this expression produces address of a temporary

随着临时存在,生成指针依然有效。有其他合法的方法可以获取临时对象的地址,只是你特定的方法恰好是不合法的。

问题回答

当C++标准中使用“shall”一词时,它的意思是“必须,否则将付出生命的代价”-如果实现不遵守这个标准,它就是有问题的。

在MSVC中,使用弃用的/Ze(启用扩展)选项是允许的。在先前版本的MSVC中也是被允许的。它会产生一个带有所有警告启用的诊断信息。

警告C4238:使用非标准扩展:类右值用作左值。

除非采用“Za”办法(增强ANSI兼容性),否则:

错误代码 C2102:& 需要左值

&std::string("test"); 正在要求函数调用返回值的地址(我们将忽略该函数是构造函数的事实,因为它与问题无关)。直到将其分配给某些东西之前,它才没有地址。因此,这是一个错误。

C++标准实际上是符合C++实现的要求。有时它是为了区分符合实现必须接受的代码和符合实现必须提供诊断的代码而编写的。

因此,就这一具体情况而言,如果采用高价值地址,则由一位符合资格的汇编者must提供诊断。 两位汇编者都这样做,因此他们在这方面是一致的。

标准不禁止产生可执行文件,如果某个输入造成诊断,即警告是有效的诊断。

我不是标准专家,但对我来说,这肯定是一个错误。 g ++通常只为真正的错误发出警告。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签