我试图检查移动构造函数调用的行为:
#include <iostream>
struct A
{
A(){ std::cout << "A()" << std::endl; };
A(A&){ std::cout << "A(A&)" << std::endl; };
A(A&&){ std::cout << "A(A&&)" << std::endl; };
};
A foo(){
return A();
}
A t(A()); //produce no output, but because of A() is prvalue, I expected A(A&&) was produced
A d(foo()); //OK, produces A()\n A(A&&)\n A(A&&)
int main(){ }
你能解释一下这种行为吗?
答案 0 :(得分:1)
此
A t(A());
是另一个函数的抽象声明。
是一个函数声明,其返回类型为A
,其中一个参数类型为A()
,其中A()
依次为函数类型id。
考虑例如
#include <iostream>
int t( int() );
int t( int ( x ) ) { return x; }
int main()
{
std::cout << t( 10 ) << std::endl;
}
这里int()
是一个带有函数抽象声明符的type-id。非常
考虑另一个抽象声明符char[10]
。还有带有抽象声明符[10]
的type-id。你可以写例如
char ( ( [10] ) )
所以这个
void f( char ( ( [10] ) ) );
是一个有效的函数声明。
如果未使用参数标识符,则可以省略它们。