最近,我开始用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;
}
很明显,移除< code>std::promise存储的< code>const解决了这个问题,但是我很好奇是否有人尝试深入研究不同编译器的< code>std::promise实现。
允许此代码使用GCC和Clang编译和工作,但在使用MSVC时产生编译错误的区别可能是什么?(通过GCC和Clang中存储数据的指针进行操作?)
看起来像是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似乎更合理的