假设我有一个包含int和char的结构:
struct thing_t {
int value = 0;
char other_value = 0;
};
Run Code Online (Sandbox Code Playgroud)
由于事物在内存中对齐的方式,sizeof(thing_t)应该是8,因为最大成员的大小是4个字节.如果我创建一个默认初始化的实例thing_t,那么额外的3个字节是否会被初始化为0?
我认识到这通常不会出现,但我正在编写一个哈希函数,哈希函数的默认行为是散列泛型类型,就像它是一个字节数组一样.如果额外的字节偶尔没有初始化为0,我意识到我的方法可能会导致问题.
C++17 有两大特性:聚合初始化和模板类型推导(对于类)。聚合初始化允许您实例化字段而无需复制或移动它们,并且模板类型推导使您不必指定参数的类型。
\n下面代码中的类Wrapper就是一个例子。只要HAVE_MOVE_AND_COPY未定义,它就具有聚合初始化,但模板类型推导不起作用。
另一方面,如果定义HAVE_MOVE_AND_COPY 了,则模板类型推导有效,但聚合初始化会中断。我怎样才能两者兼得?
#include <cstdio>\n#include <utility>\n\ntemplate<class T> \nstruct Wrapper {\n T value;\n #ifdef HAVE_MOVE_AND_COPY\n Wrapper(T const & val) : value{val} {}\n Wrapper(T && val) : value{std::move(val)} {}\n #endif\n Wrapper(Wrapper const &) = default;\n Wrapper(Wrapper &&) = default;\n \n\n};\n\nstruct VocalClass {\n VocalClass() { puts("VocalClass()"); }\n VocalClass(VocalClass const&) { puts("VocalClass(VocalClass const &)"); }\n VocalClass(VocalClass &&) { puts("VocalClass(VocalClass &&)"); }\n};\n\nint main() {\n Wrapper<VocalClass> w { VocalClass() …Run Code Online (Sandbox Code Playgroud)