对不起,这是一个冗长的问题,但让我分解一下:
C++标准是否保证:
void (*Ptr)(void) = [] {};
return Ptr;
Run Code Online (Sandbox Code Playgroud)
还会定义行为吗?
我理解,对于一个闭包,它将被定义,因为闭包对象是按值移动/复制的; 但是,虽然我知道'常规'函数具有无限/无生命,但Ptr的目标是否具有相同的?或者它是否被lambda的每个实例化破坏并重新创建?
我关心的原因是,如果不是,我不能使用lambdas作为回调.我想知道.
我找不到标准中的相关位,但是gcc和clang允许它,所以我想我想知道它是编译器扩展还是语言的一部分.如果可以,请提供链接.
这可以通过以下方式产生:
extern char arr[];
func(arr[7]); /*No error.*/
Run Code Online (Sandbox Code Playgroud)
晚编辑:我想我最好能清楚地理解这一点,虽然我已经继续前进,但我从未做过这样的事情,所以我将奖励给第一个给我一个明确,简明的参考资料的人.关于为什么允许这样做的C89标准.如果没有人能在C89中找到答案,C99是可以接受的,但您需要先查看C89标准.
我的问题不长,但对我来说这很令人费解.我是那些(我认为理所当然)想要了解他们所学语言的每一条规则的人之一.我想知道为什么语言会做它的功能.
那么,为什么++*i增加值*i而不是i指针呢?preincrement运算符的优先级高于间接运算符.这似乎是一个常识性的事情,但同样,我必须确切知道为什么.如果可以,请提供参考.