raf*_*alc 6 c++ namespaces generic-lambda c++14
考虑以下代码
#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);
}
Run Code Online (Sandbox Code Playgroud)
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++ Standard是否限制在上面的上下文中使用泛型lambda?
是的,这是一个MSVC错误,但它已在VS2017 15.6预览2.0上修复
标准中没有规范限制通用lambda仅存在于全局命名空间中.
问题的POC可以在这里找到:https://godbolt.org/g/BESMK4
MSVC不能推断auto正是T在任何情况下,与失败.
如果您需要使其与MSVC一起使用,请auto使用explicit 替换T:
template<typename T>
typename X<T>::Function X<T>::f = [](T) { return 42; };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |