由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));
}
是否是未定义的行为。规范中的哪些部分会使不未定义的行为?
答案 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
的非静态成员函数,则行为为未定义。