Alt*_*mor 4 c++ gcc visual-c++ c++11
哪一个,如果不是两个,都打破了规范?在MSVC 2013和MSVC 2013年11月CTP上尝试使用MSVC,GCC是MinGW x64 4.9.1,-std = c ++ 11.
template<typename ret_type>
class memoizer
{
using func_type = ret_type(*)(const int);
const func_type func;
std::map<int, ret_type> cache;
public:
memoizer(func_type func) : func(func)
{
}
ret_type operator [](const int n)
{
const auto it = cache.find(n);
if(it != cache.end())
return it->second;
return cache[n] = func(n);
}
};
//works in GCC but not MSVC
//error C2065: 'fib' : undeclared identifier
memoizer<int64_t> fib([](const int n)
{
return n < 2 ? n : fib[n - 1] + fib[n - 2];
});
//works in MSVC but not GCC
//error: conversion from '<lambda(int)>' to non-scalar type 'memoizer<long long int>' requested
memoizer<int64_t> fib = [](const int n)
{
return n < 2 ? n : fib[n - 1] + fib[n - 2];
};
Run Code Online (Sandbox Code Playgroud)
这似乎源于他们以不同方式处理lambda类型的方式,以及当他们考虑定义变量时.
小智 5
GCC是对的.
对于你的第一个表格:
变量被认为是在其声明者的末尾声明,该变量在其初始化之前.这就是这个表格有效的原因.着名的例子是int i = i;,语法上有效,并i使用自己的(不确定的)值进行初始化.
对于你的第二种形式:
您的初始化=失败,因为您有两个用户定义的转换.(lambda类型的转换运算符被认为是用户定义的.)它类似于
struct A { };
struct B { B(A) { } };
struct C { C(B) { } };
A a;
C c1(a); // okay
C c2 = a; // error
Run Code Online (Sandbox Code Playgroud)