Tem*_*Rex 5 c++ enums c++11 type-deduction c++14
下面的代码打印unsigned int为内部所有常量的基础类型enum Test
#include <iostream>
#include <type_traits>
#include <typeinfo>
#include <cxxabi.h>
struct Test
{
enum { a = true, b = 1 };
};
static_assert(std::is_same<
std::underlying_type_t<decltype(Test::a)>,
std::underlying_type_t<decltype(Test::b)>>::value, ""
);
int main()
{
int status;
auto const& bi = typeid(std::underlying_type_t<decltype(Test::a)>);
std::cout << abi::__cxa_demangle(bi.name(), 0, 0, &status); // unsigned int
}
Run Code Online (Sandbox Code Playgroud)
实例.如果Test包含两个单独的enumsa和b以前一样,也会发生这种情况.
问:是否有可能检测到Test::a与初始化bool并Test::b用int?在C++ 17的任何反思研究组提案中是否有任何实验代码?
注:我知道我可以解决它通过更换Test与
struct Test
{
static constexpr auto a = true;
static constexpr auto b = 1;
};
Run Code Online (Sandbox Code Playgroud)
但我觉得这个enum版本的用法略显冗长.
这是不可能的,而且我认为这也是不可能的。
原因是a和b是 (在您的情况下为 unnamed) 的值enum。因此,根据定义,它们属于 的类型enum,意思是:属于同一类型。用于初始化它们及其各自类型的表达式仅用于“计算” 的基础类型enum,而不是任何单独值的基础类型。
考虑到这一事实,我认为即使反射也无助于恢复信息,因为当您查看 anenum的值时,初始化表达式的类型被抽象掉了。
您需要的是更深层次的检查,您需要访问用于初始化值的表达式。这意味着编译器必须为每个变量、值等存储大量附加信息(因为这不仅仅是enums 的通用信息)。
考虑一下这意味着什么:
最后一点是我认为该语言真正的灾难。值应该具有单一类型,用于初始化该值的表达式不应该以任何方式访问。这就是抽象的含义,破坏它可能会导致各种微妙的依赖关系和大量的复杂性。
免责声明:这只是我个人的观点,我不能代表委员会或工作组中的任何人。
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |