gpt4 book ai didi

c++ - 这个 sizeof 表达式是如何计算的?为什么这样调用它?

转载 作者:可可西里 更新时间:2023-11-01 18:18:22 30 4
gpt4 key购买 nike

我在 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))我知道,如果分配操作失败,它将回退到返回 false 的 has_assign 的第一个定义,但我不知道为什么它有 , true)部分。

我对在赋值运算符上返回 void 并删除了 , true 的结构进行了一些测试参与sizeof给我相同的结果。

最佳答案

为了应用sizeof(),您需要一个完整的类型。但是返回一个完整的类型并不是可分配性的要求,因此:

sizeof((std::declval<X>() = std::declval<Y>(), true))
~~~~~~~~~~~~~~~~~~ expr ~~~~~~~~~~~~~~~~~~~~~

如果赋值对这两种类型有效,那么我们有 sizeof(expr) 其中 expr 的类型是 bool(因为)。因此,如果分配有效,我们将获得一些真实的 size。否则,替换失败。


但这是编写此代码的一种不必要的隐秘方式。而且,它甚至不正确,因为我可以写这样的类型:

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 表达式是如何计算的?为什么这样调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307152/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com