基本上,我们有这个代码片段:
#include <cstdint>
#include <variant>
enum class Enum1 : std::uint8_t { A, B };
enum class Enum2 : std::uint8_t { C, D };
using Var = std::variant< Enum1, Enum2 >;
using Var2 = std::variant< char >;
template< std::size_t s >
struct print_size;
void func() {
print_size< sizeof( Var ) >{};
print_size< sizeof( Var2 ) >{};
}
如果我们用 GCC 的 libstdc++ 编译它(使用 clang 或 GCC),我们会得到预期的编译错误:
error: implicit instantiation of undefined template 'print_size<2>'
此外,与 MSVC 类似(如预期的那样):
error C2027: use of undefined type 'print_size<2>'
但是,当使用带有 libc++ 的 clang 时,我收到此错误:
error: implicit instantiation of undefined template 'print_size<8>'
这表明sizeof( std::variant< char > ) == 8
在使用 libc++ 时。我已经在 Linux 上确认了这一点(请参阅上面的编译器资源管理器链接),但也适用于 Android 的 NDK r18 和 Xcode 10(iOS 和 MacOS)。
libc++ 的实现是否有理由std::variant
使用这么多内存,或者这只是 libc++ 中的一个错误,应该报告给 libc++ 开发人员?