【发布时间】: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 & 作为参数类型),则不会发生此错误。
GCC 不会显示任何警告或错误,无论有没有引用。
我做错了吗? 这是标准禁止的吗? 或者这只是 IntelliSense 的一个奇怪的怪癖?
【问题讨论】:
-
如果它编译和工作,它不只是一个智能感知问题吗?这些都不缺。
-
是的,看起来是这样,但我不确定。
-
编译器是代码正确性的权威。 IntelliSense 总是落后,而且不太可能完美无缺。
-
只刷新智能感知索引
-
@phuclv 这没有用。
标签: c++ visual-c++ intellisense c++20 c++-coroutine