该标准说
如果 lambda 表达式具有 lambda 捕获和默认的默认构造函数,则与 lambda 表达式关联的闭包类型没有默认构造函数。如果 lambda 表达式具有 lambda 捕获和默认的复制和移动赋值运算符,则它具有删除的复制赋值运算符。它有一个默认的复制构造函数和一个默认的移动构造函数 (15.8)。[ 注意:这些特殊成员函数像往常一样被隐式定义,因此可能被定义为删除。— 尾注 ]
Cppreference特别指出(强调我的)
如果未指定捕获,则闭包类型具有默认的默认构造函数。否则,它没有默认构造函数(这包括存在捕获默认值的情况,即使它实际上没有捕获任何内容)。
如果未指定捕获,则闭包类型具有默认的复制赋值运算符和默认的移动赋值运算符。否则,它具有已删除的复制赋值运算符(这包括存在捕获默认值的情况,即使它实际上并未捕获任何内容)。
所以以下必须是有效的。
auto lambda = [&](){};
static_assert(!std::is_default_constructible<decltype(lambda)>::value);
static_assert(!std::is_assignable<decltype(lambda), decltype(lambda)>::value);
Run Code Online (Sandbox Code Playgroud)
但是 MSVC 说他们是 default_constructible
,等等。
https://godbolt.org/z/E6EW3rMcE
由于论文中没有具体提到capture-default,但实际上没有提到capture,我想知道这是MSVC的缺陷还是允许实现定义的。
我已向 Microsoft 报告了此错误,它将在即将发布的发布链接上修复。
我正在尝试做的简化如下。
我必须存储 JVM(2) 和 global jobject(3)。
但在第 3 部分,
JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.NoSuchMethodError: no non-static method "Lpackage/name/here/d/b;.setInput([F)V"
Run Code Online (Sandbox Code Playgroud)
我总是收到这个错误。
结构
** <-> 表示沟通
其他 Java 类 <-> Wrapper.java
Wrapper.java <-> native-lib.cpp
native-lib.cpp <-> Wrapper.cpp
Wrapper.cpp <-> 其他 C++ 类
包装器
private static long wrapperAddr = 0; // initializes later …
Run Code Online (Sandbox Code Playgroud) 我写了一个表达式模板代码,但出现错误。
以下只是一个最小的可重现示例。
#include <iostream>
template<typename Derived>
class VecExp {
public:
double operator[](int i) const {return static_cast<Derived const&>(*this)[i];}
};
template<int n>
class Vector : public VecExp<Vector<n>> {
public:
template<int m>
Vector(const double(&arr)[m]) {
static_assert(m==n, "");
for(int i=0; i<m; ++i) data[i] = arr[i];
}
template<typename E>
Vector(const VecExp<E>& exp) {
for(int i=0; i<n; ++i) data[i] = exp[i];
}
double operator[](int i) const {std::cout<<this<<std::endl; return data[i];}
double& operator[](int i) {return data[i];}
double data[n];
};
template<typename E1, typename E2>
class VectorSum : public VecExp<VectorSum<E1, …
Run Code Online (Sandbox Code Playgroud)