C++11 将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

如图所示,有一种解决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 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
派生的类型的对象,则行为未定义


谢谢,当你指出这一点时,这一点现在似乎很明显。我在隐式转换中迷失了方向,谁知道呢!