gpt4 book ai didi

c++11 - 将 nullptr 解引用到 lambda 函数是否是未定义的行为?

转载 作者:行者123 更新时间:2023-12-03 07:00:40 29 4
gpt4 key购买 nike

pfultz2所示有一个针对 lambda 函数静态初始化的解决方法。其中一个步骤提到取消引用指向 lambda 函数类型的指针的 nullptr。

template <typename T> typename std::remove_reference <T>::type * addr (T && t)
{
return & t;
}

constexpr auto f = true ? nullptr : addr ([] (int arg) { return arg + 1; });

int main ()
{
assert (((*f) (1) == 2));
}

查看规范和另一个问题 C/C++ nullptr dereference我无法理解 *f 是否是未定义的行为。规范中的哪些部分会导致这种未定义行为?

最佳答案

What sections in the spec would make this not undefined behaviour?

这是一个错误的问题。不存在标准的一部分明确表示它未定义,而标准的另一部分又表示它已定义的程序。

您链接到的问题是关于获取取消引用的空指针的地址。那不是你在这里做的事。您在这里所做的是通过空指针调用成员函数。 (*f) (1) 表示 f->operator() (1)。这是明确无效的,如果 -fsanitize=undefined 选项,GCC 或 clang 将在运行时失败,否则可能会由于优化器假设 f != null 而导致不可预测的行为.

引用自N4140(大致为C++14),但在标准的其他版本中没有什么不同:

9.3.1 Nonstatic member functions [class.mfct.non-static]

2 If a non-static member function of a class X is called for an object that is not of type X, or of a type derived from X, the behavior is undefined.

关于c++11 - 将 nullptr 解引用到 lambda 函数是否是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41352132/

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