【发布时间】:2021-03-19 02:05:08
【问题描述】:
我注意到 GCC 7.X 中可能存在一个错误,但我在任何地方都找不到任何识别此错误的东西。很高兴知道这是否曾被报告为编译器错误或被隐藏,在您了解它之前,您会假设它可以正常工作。特别是该功能被列为支持此版本。
到目前为止,我使用此检查来确定是否可以使用模板自动参数。
#if (__cpp_template_auto >= 201606L) || (__cpp_nontype_template_parameter_auto >= 201606L)
#define TEMPLATE_AUTO_AVAILABLE 1
#endif
在旧代码中,您必须像这样声明模板:
template <typename EnumType, EnumType enumValue>
auto func() { exclusive version for EnumType::enumValue }
然后这样称呼它:
auto value = func<MyEnumType, MyEnumType::value>();
使用自动模板参数很容易像这样使用它:
template <auto enumValue>
auto func() { exclusive version for decltype(enumValue)::enumValue }
auto value = func<MyEnumType::value>();
问题在于它在 GCC 7.X 中不是等效的,并且可能导致严重的错误。
最小示例代码:
enum class FirstEnum : short { firstVal = 7 };
enum class SecondEnum : size_t { secondVal = 7 };
template <typename T>
struct TypeName;
template <>
struct TypeName<FirstEnum>
{
static constexpr auto name = "FirstEnum";
};
template <>
struct TypeName<SecondEnum>
{
static constexpr auto name = "SecondEnum";
};
template <auto t>
void func()
{
std::cout << TypeName<decltype(t)>::name << std::endl;
}
int main()
{
func<FirstEnum::firstVal>();
func<SecondEnum::secondVal>();
}
【问题讨论】:
标签: c++ templates gcc enumeration auto