c++ - 没有按预期工作的简单特征(MSVC 与 gcc 和 clang)以及如何修复它
问题描述
以下示例具有可以手动与类关联的简单特征。如果没有给出明确的定义,则应发出编译器错误。
在 MSVC 上,这按预期工作(插入笑话),而 gcc&clang 总是GetDef()
用 the实例化一般,static_assert
因此总是无法编译。据称该标准要求这样做。
如何解决此问题以在任何(插入形容词)编译器上工作?请不要发布过于复杂的解决方法,必须有一个简单的方法。
template <typename T>
auto constexpr GetDef()
{
static_assert( false, "undefined type" );
}
class MyClass {};
class MyDefinedClass {};
template <>
auto constexpr GetDef<int>()
{
return 1;
}
template<typename T> struct Trait {};
template <>
auto constexpr GetDef<MyDefinedClass>()
{
return Trait<MyDefinedClass>();
}
int main()
{
using Def1 = decltype( GetDef<int>() ); // these fail on gcc/clang
using Def2 = decltype( GetDef<MyDefinedClass>() );
//using Def3 = decltype( GetDef<MyClass>() ); // <== this one must fail
}
这是一个编译器资源管理器链接。
解决方案
推荐阅读
- mysql - 将数据集存储在 mysql 数据库中 - 6000 个条目
- python-3.x - Python脚本中的SQLite占位符错误
- c# - C# MVC 在 Visual Studio 控制台中显示已调用的方法和部分
- python - python Ubuntu:打开的文件太多 [eventpoll]
- php - PHP 如何让单选按钮工作
- c++ - 具有最小堆的 C++ 二叉树
- python - 类型错误:tree.py 中的“float”和“str”实例之间不支持“<”
- spring-boot - 在 Angular JS + Spring Boot Web 应用程序中检测并发登录
- sql - SQL Server:在多个存储过程中使用同名全局临时表
- arrays - 在 Matlab 中存储多个固定大小和数据类型的图像的所有可能和内存有效的方法是什么?