C ++ 11是否允许引用匿名临时

时间:2014-01-10 15:52:01

标签: c++ c++11

我有一个函数void foo(const std::string& s),我想使用foo(s.substr(pos))来调用。

在MSVC(实现C ++ 98)中,这个编译得很好,但是posix的旧编译器会出错,“不能引用匿名临时”。这让我觉得在标准C ++ 98中不允许引用匿名临时。

但是,它是否允许在C ++ 11中使用?

2 个答案:

答案 0 :(得分:2)

C ++ 98以及C ++ 11在绑定const引用作为参数时接受临时。以下作品:

void foo( const std::string& s );

foo( s.substr( pos ) ); // OK

如果你想采用非const引用,标准/编译器会将此视为一个提示,你需要修改后的结果,因为它是临时的,所以无法访问。因此以下不起作用:

void foo( std::string& s );

foo( s.substr( pos ) ); // not OK

请注意,使用C ++ 11,您可以重载foo来检测临时值的rvalues。 (还有其他人):

void foo( std::string& s ); // 1
void foo( std::string&& s ); // 2

foo( s.substr( pos ) ); // calls 2

答案 1 :(得分:1)

  

C ++ 11是否允许引用匿名临时文件?

是的,绝对。 C ++ 03也是如此。有条件......

  

在MSVC(实现C ++ 98)中,这个编译得很好,但是posix的旧编译器会出错,“不能引用匿名临时”。这让我觉得在标准C ++ 98中不允许引用匿名临时。

我认为你记得的东西略有不同。首先,所有临时都是“匿名的”,并且它们都可以绑定到引用 - const(绑定延长了临时的生命周期,但在下面的示例中,即使这不是必需的):

int foo(const T&);
int x = foo(T());

在标准C ++和之前的情况总是如此。如果您的旧POSIX编译器不接受它,那么它可怕地被打破;但是,我相信你会考虑以下情况:

int foo(T&);  // no `const`
int x = foo(T());

不是合法,但Visual Studio()将其视为误导的非标准异常,因为Microsoft。