c – 如何评估这个sizeof表达式?为什么这样称呼?

c – 如何评估这个sizeof表达式?为什么这样称呼?,第1张

概述我在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, s 我在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>())

这实现了相同的结果 – 替换失败与否 – 无需关心结果的类型或处理特殊情况.

总结

以上是内存溢出为你收集整理的c – 如何评估这个sizeof表达式?为什么这样称呼?全部内容,希望文章能够帮你解决c – 如何评估这个sizeof表达式?为什么这样称呼?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1243182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存