小编김선달*_*김선달的帖子

MSVC 对 C++20 中闭包类型的默认构造函数的行为有所不同

标准

如果 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 报告了此错误,它将在即将发布的发布链接上修复。

c++ visual-studio c++20

6
推荐指数
1
解决办法
110
查看次数

Android JNI 错误:NoSuchMethodError:没有非静态方法

我正在尝试做的简化如下。

  1. Java -> 调用 C++ 函数 A
  2. C++ 函数 A 调用 C++ 函数 B
  3. C++ 函数 B 调用 Java 方法 C

我必须存储 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)

我总是收到这个错误。


代码

结构

  • 包装器
  • 本机-lib.cpp
  • 包装器.cpp

** <-> 表示沟通

其他 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)

c++ java java-native-interface android jnienv

5
推荐指数
1
解决办法
2797
查看次数

引用在表达式模板中变得悬空

我写了一个表达式模板代码,但出现错误。
以下只是一个最小的可重现示例。

#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)

c++ templates reference

1
推荐指数
1
解决办法
59
查看次数