来自 Visual C++ 的奇怪错误:承诺类型没有默认构造函数

Weird error from Visual C++: No default constructor for promise type

假设我想在 C++20 中使用协同程序,并将承诺类型限制为仅接受获取一个 int & 类型参数的函数。我写了下面的代码:

#include <coroutine>

struct task {
  struct promise_type {
    promise_type(int &) {}
    task get_return_object() { return {}; }
    std::suspend_never initial_suspend() { return {}; }
    std::suspend_never final_suspend() noexcept { return {}; }
    void return_void() {}
    void unhandled_exception() {}
  };
};

task my_task(int &) {
  co_await std::suspend_never{};
}

int main() {
  int x = 5;
  my_task(x);
}

此编译和工作正常,GCC 版本 10+ 和 Visual Studio 2019 版本 16.8+。 但是,Visual Studio 2019 总是抱怨 class "task::promise_type":

不存在默认构造函数

如果我不使用引用(例如 int 而不是 int & 作为参数类型,则不会发生此错误。 GCC 不会显示任何警告或错误,无论是否有参考。

我是不是做错了什么? 这是标准禁止的吗? 或者它只是 IntelliSense 的一个怪癖?

这似乎是 IntelliSense 的问题,应该可以正常工作。要解决智能感知错误,可以只为智能感知添加一个构造函数:

#ifdef __INTELLISENSE__
promise_type();
#endif