Tem*_*Rex 5 c++ constexpr c++11 return-type-deduction c++14
考虑以下简单的类X和类模板Y<T>,每个模板定义四个constexpr成员,其中三个具有推导的返回类型(新的C++ 1y特性),另外三个子集使用另一个新的C++ 1y特性:轻松constexpr现在也可以有副作用和void返回类型的功能.
下面是一个与这些功能相互作用的小实验:
#include <type_traits>
#include <utility>
struct X
{
constexpr void fun() {} // OK
constexpr auto gun() {} // OK
auto hun() {} // OK
constexpr auto iun() { return 0; } // OK
};
template<class T>
struct Y
{
constexpr void fun() {} // OK
//constexpr auto gun() {} // ERROR, why?
auto hun() {} // OK
constexpr auto iun() { return 0; } // OK
};
int main()
{
static_assert(std::is_same<void, decltype(std::declval<X>().fun())>::value, "");
static_assert(std::is_same<void, decltype(std::declval<X>().gun())>::value, "");
static_assert(std::is_same<void, decltype(std::declval<X>().hun())>::value, "");
static_assert(std::is_same<int , decltype(std::declval<X>().iun())>::value, "");
static_assert(std::is_same<void, decltype(std::declval<Y<X>>().fun())>::value, "");
//static_assert(std::is_same<void, decltype(std::declval<Y<X>>().gun())>::value, "");
static_assert(std::is_same<void, decltype(std::declval<Y<X>>().hun())>::value, "");
static_assert(std::is_same<int , decltype(std::declval<Y<X>>().iun())>::value, "");
}
Run Code Online (Sandbox Code Playgroud)
实例只编译Clang> = 3.4(因为它是唯一支持自动返回类型推导和宽松constexpr函数的编译器)
gun()类模板中的函数Y<T>(但不在类内X)会生成编译器错误:
constexpr函数中没有return语句
问题:在类模板中组合一个constexpr函数与自动推导的void返回类型是不可能的,或者它是否是Clang中的编译器错误?
小智 2
作为普通模板函数的解决方法,您可以执行以下操作:
template<typename T> constexpr auto gun();
template<>
constexpr auto gun<void>() {}
Run Code Online (Sandbox Code Playgroud)
遵循相同的逻辑,我认为以下内容不应过多改变您的原始代码:
#include <type_traits>
#include <utility>
struct X
{
constexpr auto gun() {}
};
template<class T>
struct Y
{
constexpr auto gun();
};
template<>
constexpr auto Y<X>::gun() { }
int main()
{
static_assert(std::is_same<void, decltype(std::declval<Y<X>>().gun())>::value, "");
}
Run Code Online (Sandbox Code Playgroud)
正如已经说过的,一个空的return语句就可以解决问题。
constexpr auto gun() {return;}
Run Code Online (Sandbox Code Playgroud)