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

标签 c++11 lambda static-initialization

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/

相关文章:

c++ - 无法使用初始化列表构造 vector <std::unique<...>>

c++ - Luabind undefined symbol /Luabind::scope::scope

c++ - 在程序中显示静态 C++ 对象的初始化顺序?

c++ - 本地静态对象的非延迟初始化?

java - 静态初始值设定项不能在定义之前引用字段

c++ - 使用 for_each() 和 lambda 函数打印 C 风格数组的模板函数

c++ - 我可以使用另一种方式从 C++ 获取时间吗?

c# - lambda c# 中 "() =>"的用途是什么

具有映射值的 Java 8 Collectors.groupingBy 将收集结果设置为同一组

c++ - 如何从移动捕获 lambda 表达式创建 std::function?