来自 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
假设我想在 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