#include <type_traits>
#include <iostream>
struct my_abstract_class { virtual int x( ) = 0 ; } ;
struct my_incomplete_class;
template < typename T, typename = void >
struct can_be_returned_from_function: std:: false_type { } ;
template < typename T>
struct can_be_returned_from_function< T,
typename std:: enable_if < ! std:: is_abstract < T> :: value ,
decltype( std:: declval < T( ) > ( ) , ( void ) 0 ) > :: type >
: std:: true_type { } ;
int main( )
{
:: std :: cout
<< can_be_returned_from_function< int > :: value << :: std :: endl
<< can_be_returned_from_function< int [ ] > :: value << :: std :: endl
<< can_be_returned_from_function< int [ 2 ] > :: value << :: std :: endl
<< can_be_returned_from_function< int ( ) > :: value << :: std :: endl
<< can_be_returned_from_function< my_abstract_class> :: value << :: std :: endl
<< can_be_returned_from_function< my_incomplete_class> :: value << :: std :: endl
;
return 0 ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdHJ1Y3QgbXlfYWJzdHJhY3RfY2xhc3MgeyB2aXJ0dWFsIGludCB4KCkgPSAwOyB9OwpzdHJ1Y3QgbXlfaW5jb21wbGV0ZV9jbGFzczsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4Kc3RydWN0IGNhbl9iZV9yZXR1cm5lZF9mcm9tX2Z1bmN0aW9uOiBzdGQ6OmZhbHNlX3R5cGUgeyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGNhbl9iZV9yZXR1cm5lZF9mcm9tX2Z1bmN0aW9uPFQsCiAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19hYnN0cmFjdDxUPjo6dmFsdWUsCiAgICBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8VCgpPigpLCAodm9pZCkwKT46OnR5cGU+CiAgICA6IHN0ZDo6dHJ1ZV90eXBlIHsgfTsKICAgIAogICAgCmludCBtYWluKCkKewogICAgOjpzdGQ6OmNvdXQKICAgICAgICA8PCBjYW5fYmVfcmV0dXJuZWRfZnJvbV9mdW5jdGlvbjxpbnQ+Ojp2YWx1ZSA8PCA6OnN0ZDo6ZW5kbAogICAgICAgIDw8IGNhbl9iZV9yZXR1cm5lZF9mcm9tX2Z1bmN0aW9uPGludFtdPjo6dmFsdWUgPDwgOjpzdGQ6OmVuZGwKICAgICAgICA8PCBjYW5fYmVfcmV0dXJuZWRfZnJvbV9mdW5jdGlvbjxpbnRbMl0+Ojp2YWx1ZSA8PCA6OnN0ZDo6ZW5kbAogICAgICAgIDw8IGNhbl9iZV9yZXR1cm5lZF9mcm9tX2Z1bmN0aW9uPGludCgpPjo6dmFsdWUgPDwgOjpzdGQ6OmVuZGwKICAgICAgICA8PCBjYW5fYmVfcmV0dXJuZWRfZnJvbV9mdW5jdGlvbjxteV9hYnN0cmFjdF9jbGFzcz46OnZhbHVlIDw8IDo6c3RkOjplbmRsCiAgICAgICAgPDwgY2FuX2JlX3JldHVybmVkX2Zyb21fZnVuY3Rpb248bXlfaW5jb21wbGV0ZV9jbGFzcz46OnZhbHVlIDw8IDo6c3RkOjplbmRsCiAgICAgICAgOwogICAgcmV0dXJuIDA7Cn0=