GCC 4.7.2编译:
constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
Run Code Online (Sandbox Code Playgroud)
但不是这个:
constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
Run Code Online (Sandbox Code Playgroud)
根据C++11§5.1.2/ 15,后一个例子对我来说是正确的:
如果实体是隐式或显式捕获但未通过复制捕获,则通过引用捕获实体.未指定是否在闭包类型中为通过引用捕获的实体声明了其他未命名的非静态数据成员.
似乎ilambda中捕获的对象引用了封闭范围中的变量constexpr,而不仅仅是const引用.
该标准明确指出,使用按值捕获转换为对lambda对象的相应成员的使用.我认为5.1.2提示我的解释是正确的.
是否有任何明确说明通过引用捕获是否引用封闭范围中的对象或引用?
这是此处讨论的后续内容.
以下代码在gcc和clang(实时演示)下编译.//1由于lambda没有捕获任何东西,因此对于该情况而言这是令人惊讶的.对于MCR2lambda返回指针本身的情况,我们得到预期的编译时错误(行// Will not compile).运算符的应用sizeof与返回指针有何不同?
#include <iostream>
#define MCR1(s) \
([]() { return sizeof(s); })()
#define MCR2(s) \
([]() { return s; })()
int main() {
auto *s= "hello world";
auto x1 = MCR1( s ); //1
auto y1 = MCR1( "hello world" );
// auto x2= MCR2( s ); // Will not compile
auto y2= MCR2( "hello world" );
std::cout << x1 << " " << y1 …Run Code Online (Sandbox Code Playgroud) GCC并Clang编译以下代码:
void Test()
{
constexpr int Size = 3;
auto Lambda = [Size]{ int Dim[Size]; };
}
Run Code Online (Sandbox Code Playgroud)
但是,VisualStudio 2015 CTP 6没有.尽管如此,所有3个编译器都对此代码感到满意:
void Test()
{
static constexpr int Size = 3;
auto Lambda = []{ int Dim[Size]; };
}
Run Code Online (Sandbox Code Playgroud)
哪个片段实际上是以正确的方式进行的?C++标准说什么?