为什么没有构造函数调用?

时间:2014-11-05 05:17:39

标签: c++ constructor

我试图检查移动构造函数调用的行为:

#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(){ }

DEMO

你能解释一下这种行为吗?

1 个答案:

答案 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] ) ) );

是一个有效的函数声明。

如果未使用参数标识符,则可以省略它们。