C++11 将nullptr解引用到lambda函数的行为是否未定义?
如图所示,有一种解决lambda函数静态初始化的方法。其中一个步骤提到将指针的nullptr解引用到lambda函数类型C++11 将nullptr解引用到lambda函数的行为是否未定义?,c++11,lambda,static-initialization,C++11,Lambda,Static Initialization,如图所示,有一种解决lambda函数静态初始化的方法。其中一个步骤提到将指针的nullptr解引用到lambda函数类型 template <typename T> typename std::remove_reference <T>::type * addr (T && t) { return & t; } constexpr auto f = true ? nullptr : addr ([] (int arg) { return a
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));
}
template typename std::remove\u reference::type*addr(T&&T)
{
返回&t;
}
constexpr auto f=true?nullptr:addr([](int-arg){return arg+1;});
int main()
{
断言((*f)(1)==2));
}
通过规范和另一个问题,我很难理解*f
是否是未定义的行为。规范中的哪些部分会使这种行为不具有未定义性
规范中的哪些部分会使这种行为不具有未定义性
这个问题问错了。没有一个程序,其中一部分标准明确表示它未定义,另一部分标准表示它已定义
您链接到的问题是关于获取未引用的空指针的地址。那不是你在这里做的。这里要做的是通过空指针调用成员函数(*f)(1)
表示f->operator()(1)
。如果-fsanize=undefined
选项,则该选项显式无效,将在运行时使用GCC或clang失败,并且由于优化程序假定f!=空
引用N4140(大致为C++14),但在标准的其他版本中没有什么不同:
9.3.1非静态成员函数[class.mfct.non static]
2如果类X
的非静态成员函数被调用用于非X
类型的对象,或从X
派生的类型的对象,则行为未定义
谢谢,当你指出这一点时,这一点现在似乎很明显。我在隐式转换中迷失了方向,谁知道呢!