如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 typeX
, or of a type derived fromX
, the behavior is undefined.
关于c++11 - 将 nullptr 解引用到 lambda 函数是否是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41352132/