这应该编译吗?
Should this compile?
我有以下代码:
#include "type_traits"
template<typename T_>
struct thing{
template<typename me_type>
struct inner {
static T_& impl_0 (void* me ) { return static_cast<me_type*>(me )->operator*(); }
static auto getThing()
{
return std::integral_constant<T_& (*)(void*),&impl_0>();
}
};
};
它在一个模板化 class 中声明了一个静态函数,该函数在另一个模板化 class 中。
然后它声明一个自动函数,returns 一个指向该函数的指针,但首先它把它放入一个 std::integral_constant
当我将其提供给带有编译器标志 -std=c++14
的 gcc 7.3 版 (godbolt) 时,它会抱怨:
<source>: In static member function 'static auto thing<T_>::inner<me_type>::getThing()':
<source>:11:69: error: template argument 2 is invalid
return std::integral_constant<T_& (*)(void*),&impl_0>();
但是当我把它交给 clang 版本 6.0.0 时,它编译得很好 (godbolt)。
该不该编译?
我认为,它应该按原样编译,因为函数名应该是可见的。然而,这解决了它:
struct inner {
static auto getThing()
{
return std::integral_constant<T_& (*)(void*),&inner::impl_0>();
}
};
我有以下代码:
#include "type_traits"
template<typename T_>
struct thing{
template<typename me_type>
struct inner {
static T_& impl_0 (void* me ) { return static_cast<me_type*>(me )->operator*(); }
static auto getThing()
{
return std::integral_constant<T_& (*)(void*),&impl_0>();
}
};
};
它在一个模板化 class 中声明了一个静态函数,该函数在另一个模板化 class 中。
然后它声明一个自动函数,returns 一个指向该函数的指针,但首先它把它放入一个 std::integral_constant
当我将其提供给带有编译器标志 -std=c++14
的 gcc 7.3 版 (godbolt) 时,它会抱怨:
<source>: In static member function 'static auto thing<T_>::inner<me_type>::getThing()':
<source>:11:69: error: template argument 2 is invalid
return std::integral_constant<T_& (*)(void*),&impl_0>();
但是当我把它交给 clang 版本 6.0.0 时,它编译得很好 (godbolt)。
该不该编译?
我认为,它应该按原样编译,因为函数名应该是可见的。然而,这解决了它:
struct inner {
static auto getThing()
{
return std::integral_constant<T_& (*)(void*),&inner::impl_0>();
}
};