我有一个函数void foo(const std::string& s)
,我想使用foo(s.substr(pos))
来调用。
在MSVC(实现C ++ 98)中,这个编译得很好,但是posix的旧编译器会出错,“不能引用匿名临时”。这让我觉得在标准C ++ 98中不允许引用匿名临时。
但是,它是否允许在C ++ 11中使用?
答案 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。