我有带有成员函数的类/结构。我想检查返回类型的大小是否正确。
#include <iostream>
#include <type_traits>
struct QString {
wchar_t ucs2() {return L"1"[0];}
};
int main() {
QString arg;
std::cout << "wchar_t " << sizeof(wchar_t) << std::endl;
std::cout << "std::invoke_result_t<decltype(&QString::ucs2)(void)> " << sizeof(std::invoke_result_t<decltype(&QString::ucs2)(void)>) << std::endl;
}
例如,结果为
wchar_t 4
std::invoke_result_t<decltype(&QString::ucs2)(void)> 16
所以我得到不同的尺寸。我期望std::invoke_result_t<decltype(&QString::ucs2)(void)
是我的ucs2函数的返回类型,即wchar_t,但事实并非如此。这是怎么回事?
答案 0 :(得分:2)
invoke_result
定义为:
template< class F, class... ArgTypes>
class invoke_result;
因此,这可以正常工作
return sizeof(std::invoke_result_t<decltype(&QString::ucs2), QString>);
答案 1 :(得分:2)
一个更简单的解决方案:
int main() {
std::cout << sizeof(QString().ucs2()) << '\n';
return 0;
}
QString()
的默认构造一个QString,然后可以将其用于调用ucs2。但是由于这一切都是作为sizeof的操作数发生的,因此实际上没有构造或调用任何东西。即使没有启用优化,编译器也会在编译时进行所有类型分析。
很明显,如果您不能默认构造该类,则此方法可能没用。