clang 相关问题

有关clang LLVM编译器前端的问题。有关C的一般问题,请使用C标记。

为什么这个运算符重载可以在 MSVC 和 GCC 中编译,但不能在 Clang 中编译?

我正在尝试创建一个strong_alias包装类型,它可以与原始类型互换,但不能与其他strong_alias互换。 #包括 #包括 模板 我正在尝试创建一个 strong_alias 包装类型,它可以与原始类型互换,但不能与其他 strong_aliases 互换。 #include <array> #include <stdint.h> template <typename T, typename tag> requires std::is_arithmetic<T>::value class strong_alias { public: using type = T; constexpr strong_alias() : _value{} { } template <typename other> requires std::is_arithmetic<other>::value constexpr strong_alias(const other &set_value) : _value{T(set_value)} { } constexpr T &value() { return _value; } constexpr const T &value() const { return _value; } template <typename other> requires std::is_arithmetic<other>::value constexpr operator other() const { return other(value()); } constexpr bool operator==(const strong_alias &rhs) const { return value() == rhs.value(); } constexpr strong_alias operator*(const strong_alias &rhs) const { return value() * rhs.value(); } private: T _value; }; using A = strong_alias<int8_t, struct A_tag>; static_assert(std::is_assignable<A, A>()); static_assert(std::is_assignable<A, int>()); static_assert(std::is_assignable<int &, A>()); using B = strong_alias<int8_t, struct B_tag>; static_assert(not std::is_assignable<A, B>()); static_assert(not std::is_assignable<B, A>()); static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang int main() { } 上面的代码可以使用 MSVC (/std:c++latest) 和 GCC (-std=c++2c) 进行编译,但不能使用 Clang (-std=c++2c) 进行编译。 这里有编译器资源管理器演示。 哪些编译器能够正确处理这段代码?在 Clang 下使其工作的首选方法是什么? Compiler Explorer 的 Clang 输出: <source>:61:29: error: use of overloaded operator '*' is ambiguous (with operand types 'A' (aka 'strong_alias<signed char, A_tag>') and 'int') 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ~~~~ ^ ~~ <source>:43:25: note: candidate function 43 | constexpr strong_alias operator*(const strong_alias &rhs) const | ^ <source>:61:29: note: built-in candidate operator*(float, int) 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ^ <source>:61:29: note: built-in candidate operator*(double, int) <source>:61:29: note: built-in candidate operator*(long double, int) <source>:61:29: note: built-in candidate operator*(int, int) [...many lines omitted...] <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned __int128) 1 error generated. Compiler returned: 1 首先,我们应该在重现问题的同时尽可能地简化代码。令人失望的是,OP 似乎没有做出任何尝试这样做。这是最小化版本: #include <type_traits> struct A { A(int set_value) : _value{set_value} { } template <typename other> requires std::is_arithmetic<other>::value operator other() const { return other(_value); } A operator*(const A &rhs) const { return _value * rhs._value; } int _value = 0; }; int main() { (void)(A(3) * -1); } 现在,这个*可以有几种不同的解释方式。它可以是 A::operator*,可通过第二个操作数从 int 到 A 的隐式转换来调用,也可以是内置算术 operator*,可通过第一个操作数的隐式转换来调用操作数从 A 到算术类型(可能第二个操作数也经历到不同算术类型的隐式转换)。 Clang 可以帮助打印出所有候选人。 之所以不明确,是因为当调用operator*时,我们得到了与第一个参数类型的精确匹配以及与第二个参数类型的用户定义转换。当调用内置的 operator*(int, int) 时,我们得到一个用户定义的转换,其第一个参数类型与第二个参数类型完全匹配。所以这两个候选人都不比另一个更好。 叮当是正确的。至于如何编译原始代码,由于问题是由两个候选代码引起的,每个候选代码都可以通过不同的隐式转换实现,因此您的选择基本上是: 提供比所有当前现有候选更好的您自己的重载,例如,一个 operator*,其第一个参数类型为 const strong_alias&,第二个参数类型为算术类型,或者 将 A 的转换构造函数更改为显式,或者 将转换函数 (A::operator other) 更改为显式,或者 以上任意组合 我无法告诉您哪个选项最适合您。这取决于您希望您的类型提供的 API。 GCC 和 MSVC 之所以不认为它含糊不清,可能与他们使用不同的算法来确定哪些内置运算符是候选者有关。在这种特殊情况下,他们只是给出了错误的答案,但更普遍的是,该标准没有就如何在其他可能涉及无限的初始候选者的情况下缩小一组相关内置候选者的范围提供足够的指导。请参阅CWG2844。

回答 1 投票 0

clang(和 LLVM)和 gcc / g++ 有什么区别?

gcc 和 g++ 是 C 和 C++ 代码的传统 GNU 编译器。最近,使用 LLVM 的 clang(和 clang++)作为替代编译器越来越受欢迎。 CLASS 和 CLASS 有什么区别

回答 1 投票 0

为什么 Clang 中删除了 to_chars 和 from_chars 函数

我尝试编译我的代码,但 charconv 头文件中的以下函数(即使它没有 .h 扩展名)无法编译,因为它们已在我使用的 Clang 版本中被删除: ...

回答 1 投票 0

clang 的 -Wweak-vtables 是什么意思?

我基本上不懂clang的-Wweak-vtables。以下是我迄今为止观察到的情况: 情况一:(触发警告) A类{ 民众: 虚拟 ~A(){} }; B 类:公共 A {

回答 2 投票 0

如何在clang中链接experimental::simd

我在 MacOS Ventura 上的 clang++ 中链接 std::experimental::simd 操作时遇到问题。这是我最小的失败: #包括 使用 std::experimental::simd; int main(...

回答 1 投票 0

编译器不会警告“int in bool context”

在我的项目中,我将许多函数的返回值从布尔值更改为枚举值。 问题出在整合上。编译器不会警告我错误使用这些函数。 我正在使用...

回答 1 投票 0

尝试用 clang 静态链接 libc,ldd 显示动态链接?

我想编译一个带有静态链接的系统库(例如 libc)和动态链接的所有其他自定义库(例如 openssl)的 C 程序。当我编译“Hello World&q...

回答 1 投票 0

使用clang的libTooling重写嵌套三元表达式

以下包含嵌套三元语句的“C”源代码无法使用我的 RecursiveASTVisitor 使用 libTooling 的 clang::Rewriter 正确重写。 我不明白为什么会这样......

回答 1 投票 0

确保您的 PATH 中有 llvm-symbolizer 或设置环境变量 LLVM_SYMBOLIZER_PATH 指向它 - 退出代码 139

就我而言,我正在尝试使用 emscripten 构建一个库(开放级联)。 我必须使用特定版本的 Emscripten (3.1.39),所以 clang 版本是 13。 我使用的是Ubuntu 22 日志: [ 0%] 建造...

回答 1 投票 0

使用引导编译器与使用系统工具构建的相同编译器相比有什么好处?

我一直在一个古老的 Linux 发行版上尝试最新版本的 clang,使用系统提供的 gcc7 构建最新版本的 llvm 项目。这对于...

回答 1 投票 0

如何将 clang 格式的结果输出到文件?

我想使用 clang-format 将 C/C++ 文件转储到磁盘中。我现在正在使用这个命令: clang格式的文件.c 重新格式化以下源代码片段: int main() { 字符名称[50]; int 我...

回答 2 投票 0

GCC“标签作为值”——预期用途

我最近听说 GCC 和其他编译器中对 C/C++ 的标签作为值扩展。我正在考虑如何使用它来编写线程解释器(其中虚拟机程序是

回答 1 投票 0

Windows 上的 lldb,可能吗?

我只是在 Windows 上构建 clang。为了使其更加完整,似乎还应该制作编译器 lldb。 如何使用 mingw 构建 lldb?或者应该用 clang 构建?

回答 2 投票 0

使用 gcc 4.8 构建时如何检测是否使用地址清理器构建?

我正在开发一个用 C 编写的程序,我偶尔会使用地址清理程序来构建该程序,主要是为了捕获错误。该程序启动时会在日志中打印一条横幅,其中包含以下信息:who bui...

回答 3 投票 0

如何用clang生成.map文件?

Clang 中 /MAP 的等效标志是什么来生成 .map 文件?

回答 2 投票 0

使用 cmake、clangcl 和 Visual Studio 2022 构建 zlib 时出现构建问题

我想使用 clangcl 而不是 VS2022 标准工具集构建 zlib。所以我发现我可以使用 cmake 的 -T 选项来实现这一点。它正确选择 clang-cl 但我遇到了一些 str...

回答 1 投票 0

如何在github操作工作流程yaml文件中编写If else条件?

在这里,我给出了一组行。但根本行不通。无法同时进行“运行 Clang 静态分析 (C)”和“运行静态代码分析 (C++)”。为什么? 问题:当我需要推动 C 或 CPP 或两者时......

回答 1 投票 0

是否可以使用命令行(例如 man clang)获得有关 Clang 的全面帮助/参考信息?

在使用GCC时,我通常使用man gcc来查找帮助/参考信息(命令行选项的描述等)。大多数时候 man gcc 的输出确实包含帮助/参考信息...

回答 1 投票 0

Clang 格式将方法调用和语句拆分为多行

我在 Windows 上使用 clang-format 版本 18。 在大多数情况下,我们希望方法调用中的所有参数都位于同一行,但在复杂的情况下,我们希望它们位于不同的行并对齐...

回答 1 投票 0

Clang 18.1.5 和 std::println 的支持

我最近通过brew包管理器将我的M1 Mini Mac上的Clang编译器从Clang 17.0.6升级到Clang 18.1.5。我有几个具有 std::println 的测试程序,它可以很好地工作......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.