解除引用nullptr到lambda函数未定义的行为?

时间:2016-12-27 20:56:57

标签: c++11 lambda static-initialization

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

mysqld_safe --wsrep-recover

完成规范和另一个问题C/C++ nullptr dereference我无法理解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)); } 是否是未定义的行为。规范中的哪些部分会使未定义的行为?

1 个答案:

答案 0 :(得分:3)

  

规范中的哪些部分会使这不是未定义的行为?

这是一个错误的问题。没有任何程序,标准的一部分明确表示它未定义,标准的另一部分表示它已定义。

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

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

  

9.3.1非静态成员函数[class.mfct.non-static]

     

2如果为类型为X的类型的对象或从X派生的类型调用类X的非静态成员函数,则行为为未定义。