通用 lambda 不能在命名空间中使用?
Generic lambda cannot be used within a namespace?
考虑以下代码
#include <iostream>
#include <functional>
namespace A {
template<typename T>
struct X {
using Function = std::function<int(T)>;
static Function f;
};
template<typename T>
typename X<T>::Function X<T>::f = [](auto) { return 42; };
}
int main() {
std::cout << A::X<int>::f(0);
}
GCC 和 clang 都接受此代码,但 MSVC(已测试版本 19.00.23506)给出:
error C2888: 'auto <lambda_ce48e25aa4b9e3d225584044e4eae9e2>::operator ()(_T1) const': symbol cannot be defined within namespace 'A'
事实上,如果我删除命名空间 A 并在全局命名空间中定义所有内容,代码就会被接受。如果我将 lambda 表达式设为非泛型,则相同。
谁能解释一下 MSVC 在这段代码中看到的问题是什么? C++ 标准是否限制在上述上下文中使用通用 lambda?
是的,这是一个 MSVC 错误,但 它已在 VS2017 15.6 预览版 2.0 上修复
标准中没有规范限制泛型 lambda 只存在于全局命名空间中。
问题的 POC 可以在这里找到:https://godbolt.org/g/BESMK4
MSVC 无法在所有情况下推断出 auto
恰好是 T
,因此失败。
如果您需要使其与 MSVC 一起使用,请将 auto
替换为明确的 T
:
template<typename T>
typename X<T>::Function X<T>::f = [](T) { return 42; };
考虑以下代码
#include <iostream>
#include <functional>
namespace A {
template<typename T>
struct X {
using Function = std::function<int(T)>;
static Function f;
};
template<typename T>
typename X<T>::Function X<T>::f = [](auto) { return 42; };
}
int main() {
std::cout << A::X<int>::f(0);
}
GCC 和 clang 都接受此代码,但 MSVC(已测试版本 19.00.23506)给出:
error C2888: 'auto <lambda_ce48e25aa4b9e3d225584044e4eae9e2>::operator ()(_T1) const': symbol cannot be defined within namespace 'A'
事实上,如果我删除命名空间 A 并在全局命名空间中定义所有内容,代码就会被接受。如果我将 lambda 表达式设为非泛型,则相同。
谁能解释一下 MSVC 在这段代码中看到的问题是什么? C++ 标准是否限制在上述上下文中使用通用 lambda?
是的,这是一个 MSVC 错误,但 它已在 VS2017 15.6 预览版 2.0 上修复
标准中没有规范限制泛型 lambda 只存在于全局命名空间中。
问题的 POC 可以在这里找到:https://godbolt.org/g/BESMK4
MSVC 无法在所有情况下推断出 auto
恰好是 T
,因此失败。
如果您需要使其与 MSVC 一起使用,请将 auto
替换为明确的 T
:
template<typename T>
typename X<T>::Function X<T>::f = [](T) { return 42; };