std::p romise<T> 其中 T 必须在 Visual Studio 2017 中默认构造?

std::promise<T> where T must be default constructible in Visual Studio 2017?

本文关键字:2017 Studio 默认 Visual lt romise gt 其中 std      更新时间:2023-10-16

我正在尝试在Visual Studio 2017中编译以下代码:

#include <future>
int main()
{
    std::promise<std::reference_wrapper<int>> promise;
    (void)promise;
}

但是,我收到以下错误:

错误 C2512:"std::reference_wrapper":没有可用的适当默认构造函数

而它与GCC和Clang编译良好。

这是Visual Studio中的一个明确的错误,还是std::p romise的有效实现?

看起来这是 MSVC 标准库实现中的一个已知问题。更简单的复制场景:

#include <future>
struct NoDefaultCtor
{
    NoDefaultCtor() = delete;
};
int main() {
    std::promise<NoDefaultCtor> p;
    return 0;
}

我想你不需要std::reference_wrapper<int>.有合适的重载模板可用于std::promise

template<class R> class promise<R&>;

因此,您可以在Visual Studio 2017中修复代码:

#include <future>
int main()
{
    std::promise<int&> promise;
    (void)promise;
}