#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+Ojp2YWx1ZSA8PCA6OnN0ZDo6ZW5kbAogICAgICAgIDw8IGNhbl9iZV9yZXR1cm5lZF9mcm9tX2Z1bmN0aW9uPGludCgpPjo6dmFsdWUgPDwgOjpzdGQ6OmVuZGwKICAgICAgICA8PCBjYW5fYmVfcmV0dXJuZWRfZnJvbV9mdW5jdGlvbjxteV9hYnN0cmFjdF9jbGFzcz46OnZhbHVlIDw8IDo6c3RkOjplbmRsCiAgICAgICAgLy88PCBjYW5fYmVfcmV0dXJuZWRfZnJvbV9mdW5jdGlvbjxteV9pbmNvbXBsZXRlX2NsYXNzPjo6dmFsdWUgPDwgOjpzdGQ6OmVuZGwKICAgICAgICA7CiAgICByZXR1cm4gMDsKfQ==