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

为什么这种检测习惯用法的使用会导致Clang和GCC出现不同的编译错误,而MSVC则没有。

段干飞翔
2023-03-14

在使用检测习惯用法和< code>void_t时,我发现包含减法运算符和void*的表达式会在测试的编译器中导致不同的错误。

GCC 10.2及以下,无论是否使用C 11、14、17或20,似乎都将某些表达式视为硬错误,而不是替换失败。

我正在使用以下(条带化)示例

#include <type_traits>

template< class, class, class = void >
struct has_minus_void_t : std::false_type {};
template<class T, class U>
struct has_minus_void_t<T, U, std::void_t<
    decltype(T() - U())
    >> : std::true_type {};

static_assert(has_minus_void_t<int*,int*>::value, "int*");
static_assert(!has_minus_void_t<int*,void*>::value, "intvoid*");
static_assert(!has_minus_void_t<void*,int*>::value, "voidint*");
static_assert(!has_minus_void_t<void*,void*>::value, "void*");

并且希望代码能够针对所有四种语言标准编译无误(包含对C 17之前版本的< code>std::void_t替换,因此可以测试更多的标准),但是

  • GCC 10.2及以下版本抱怨最后两个断言
  • 铿锵不抱怨
  • MSVC抱怨int*/void*组合

我试图搜索现有的错误报告,但找不到。

我想知道哪个编译器是正确的,为什么?

这是一个神箭。

共有1个答案

景康安
2023-03-14

GCC 10.2和更早版本将< code>(void*)0 - (void*)0视为硬错误而非软错误是错误的。这是固定在行李箱里的。

Clang做什么都正确。

MSVC错误地允许(int*)0-(void*)0;(同时正确拒绝(void*)0-(int*)0;),如下所示:

对于减法,应满足以下条件之一:...

-这两个操作数都是指向同一完全定义的对象类型的cv限定或cv非限定版本的指针。。。

 类似资料:
  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 运行此代码时,Clang(3.9.1)和GCC(7,快照)将“1”、“2”打印到控制台。 但是,MSVC未能编译此代码: source_file.cpp(15):错误C2668:字典::集:对重载函数的模糊调用 source_file.cpp(9):注意:可能是“无效字典::集(int64_t)” source_file.cpp(8):注意:或'无效字典::集(const char*)' 源文件。

  • 我使用比较器对流进行排序,遇到了一个我不理解的编译器错误。 假设我有以下课程: 我正在创建两个比较器,以按日期对s进行排序,一个按自然顺序,另一个按相反顺序。编译以下代码: 意识到是在上定义的,我想我会尝试以下操作: (对我来说)令人惊讶的是,rev2的代码编译正常,而rev1的代码产生以下错误: 为什么我会收到这些编译器错误?为什么我可以在从构建时有效地规避它们? (如果相关的话,我正在使用Ec

  • 我使用IntelliJ进行java开发。我想在我只有shell访问权限的另一台主机上运行我的应用程序。 当我在本地运行应用程序时,一切都很好。当我尝试在远程主机上编译代码时,我得到: 文件位于同一目录中: 我也不能在本地编译,除非它来自IDE,所以我假设我只是没有做正确的事情。我错过了什么?我只想能够从shell运行我的应用程序,我真的不在乎如何运行。

  • 今天我遇到了一个有趣的问题,是我自己打错的。我创建了一个lambda,它接受了对结构的引用,并错误地将其设置为按值接收参数的std::函数。 这里有一个更简洁的版本: 使用godbolt检查显示,使用MSVC编译成功,但对于Clang和GCC都失败了。 这是MSVC编译器中的bug吗?