当前位置: 首页 > 知识库问答 >
问题:

promise如何在MSVC、GCC和Clang中存储const类型?

夏侯昊明
2023-03-14

最近,我开始用MSVC编译一段代码,这段代码总是用GCC和Clang编译的。这段代码产生了一个有趣的编译错误(被截断):

C:/data/msvc/14.33.31424-Pre/include\future(311) error C2678: binary '=': no operator found which takes a left-hand operand of type 'const Result' (or there is no acceptable conversion)
<source>(7): note: could be 'Result &Result::operator =(Result &&)'
<source>(7): note: or       'Result &Result::operator =(const Result &)'

这段代码的最小示例:

#include <future>
#include <iostream>

struct Result {
    int data{0};
};

// getting rid of constness resolves the problem for MSVC
using result_t = const Result; 
using promise_result_t = std::promise<result_t>;

auto compute_result(promise_result_t result)
{
    Result some_result{10};
    result.set_value(std::move(some_result));
}

int main()
{
    promise_result_t my_promise;
    auto my_future = my_promise.get_future();
    std::thread thread(compute_result, std::move(my_promise));
    std::cout << "result: " << my_future.get().data;
    thread.join();
    return 0;
}
  • 使用Clang 11成功编译:https://godbolt.org/z/o6Ge85rxG
  • 使用GCC 12成功编译:https://godbolt.org/z/x1rhqhfGT
  • MSVC 19出错:https://godbolt.org/z/4jMYhTj3n

很明显,移除< code>std::promise存储的< code>const解决了这个问题,但是我很好奇是否有人尝试深入研究不同编译器的< code>std::promise实现。

允许此代码使用GCC和Clang编译和工作,但在使用MSVC时产生编译错误的区别可能是什么?(通过GCC和Clang中存储数据的指针进行操作?)

共有1个答案

胡景焕
2023-03-14

看起来像是MSVC问题,在此处报告:

https://developer community . visual studio . com/t/STD::promise-works-error-for-const/10092031

并链接到 GitHub 上的问题:

https://github.com/microsoft/STL/issues/2599

 类似资料:
  • 请查看以下代码: gcc和clang编译并链接它时没有任何问题,而MSVC(2015、2019)生成了未解决的外部符号“void _cdecl test(int*)” 请注意,如果从库中删除const关键字。cpp然后MSVC链接代码。 谁在这里?是MSVC的错误吗?

  • 从原子函数指针调用函数时,如: gcc一点也不抱怨,而clang和msvc在调用时有问题: [clang]:错误:调用类型为'std::atomic的对象 Clang还指定可能的呼叫候选者为: 波动性的这种差异似乎让clang和msvc感到困惑,但海湾合作委员会却没有。 当调用从更改为

  • 我正在尝试同时处理MSVC和GCC编译器,同时更新这个代码库以在GCC上工作。但我不确定GCCs内联ASM是如何工作的。现在我并不擅长将ASM转换为C,否则我就会使用C而不是ASM。 我假设ROR13的工作方式类似于,但代码不会产生相同的输出。 什么是将这个内联ASM翻译成GCC的正确方法,或者这个代码的C翻译是什么?

  • 下面是一个非常简单的C代码: 更令人震惊的是,这段代码显示了GCC、Clang和MSVC之间不同的结果。 我试过4个编译器 > GCC:编译良好,打印。 叮当声:编译良好,打印。 MSVC(在线):编译失败。 带有Visual Studio 2019的MSVC(本地):编译良好,打印。(有趣的是,如果我删除,它会打印。) 我不确定指向成员的指针及其自己的成员的类内初始化是否合法,但我相信这段代码应

  • 考虑到这个辅助函数: 它应该将基本类型(和字符串)转换为字符串表达式,当我像这样使用它时,MSVC会出现编译错误: 有了clang,编译起来没有任何问题,但有了MSVC,我明白了: 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 显然,编译器会考虑

  • 我知道movzx可以用于打破依赖关系,但我偶然发现Clang和GCC都使用了movzx,我真的看不出它们有什么好处。下面是我在godbolt上尝试的一个简单示例: 对于gcc12-O3: 如果我理解正确,这里的第一个movzx打破了对前一个eax值的依赖,但是第二个movzx在做什么?我不认为它可以打破任何依赖,也不应该影响结果。 有了clang14-O3,就更奇怪了: 它在movzx似乎更合理的