c – 如何评估这个sizeof表达式?为什么这样称呼?
发布时间:2020-12-16 04:55:22 所属栏目:百科 来源:网络整理
导读:我在std :: optional实现中遇到了这段代码: template class T,class Ustruct is_assignable{ template class X,class Y constexpr static bool has_assign(...) { return false; } template class X,class Y,size_t S = sizeof((std::declvalX() = std::dec
我在std :: optional实现中遇到了这段代码:
template <class T,class U> struct is_assignable { template <class X,class Y> constexpr static bool has_assign(...) { return false; } template <class X,class Y,size_t S = sizeof((std::declval<X>() = std::declval<Y>(),true)) > // the comma operator is necessary for the cases where operator= returns void constexpr static bool has_assign(bool) { return true; } constexpr static bool value = has_assign<T,U>(true); }; 我无法理解它是如何工作或如何评估的部分是size_t S = sizeof((std :: declval< X>()= std :: declval< Y>(),true))我知道如果分配操作失败它会回到has_assign的第一个定义,返回false,但我不知道为什么它有真正的部分. 我对使用在assign运算符上返回void的结构进行了一些测试,并删除了sizeof中的true部分,给出了相同的结果. 解决方法
要应用sizeof(),您需要一个完整的类型.但返回完整类型不是可分配性的要求,因此:
sizeof((std::declval<X>() = std::declval<Y>(),true)) ~~~~~~~~~~~~~~~~~~ expr ~~~~~~~~~~~~~~~~~~~~~ 如果赋值对这两种类型有效,那么我们有sizeof(expr),其中expr的类型是bool(因为是真的).因此,如果赋值有效,我们会得到一些实际大小.否则,替换失败. 但这是编写此代码的一种不必要的神秘方式.而且,它甚至不正确,因为我可以写一个类似的类型: struct Evil { template <class T> Evil operator=(T&& ); // assignable from anything void operator,(bool); // mwahahaha }; 现在你的sizeof()仍然不起作用. 相反,更喜欢简单: class = decltype(std::declval<X>() = std::declval<Y>()) 这实现了相同的结果 – 替换失败与否 – 无需关心结果的类型或处理特殊情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |