【问题标题】:Weird error from Visual C++: No default constructor for promise type来自 Visual C++ 的奇怪错误:Promise 类型没有默认构造函数
【发布时间】:2021-07-16 11:35:11
【问题描述】:

假设我想在 C++20 中使用协程,并将 Promise 类型限制为只接受获得一个 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 总是抱怨“task::promise_type”类不存在默认构造函数:

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

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

【问题讨论】:

  • 如果它编译和工作,它不只是一个智能感知问题吗?这些都不缺。
  • 是的,看起来是这样,但我不确定。
  • 编译器是代码正确性的权威。 IntelliSense 总是落后,而且不太可能完美无缺。
  • 只刷新智能感知索引
  • @phuclv 这没有用。

标签: c++ visual-c++ intellisense c++20 c++-coroutine


【解决方案1】:

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

#ifdef __INTELLISENSE__
promise_type();
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 2018-03-09
    • 2023-03-20
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多