visual-c++ 相关问题

Microsoft Visual C ++是Windows的C,C ++和C ++ / CLI编译器。最新版本的编译器是Visual C ++ 2017.编译器支持以下语言:C:支持C90和ISO C ++标准的大部分C99和C11部分,自Visual Studio 2017 C ++开始:支持大多数C ++ 11功能以及Visual Studio 2017 C ++ / CLI中的一些C ++ 14和C ++ 17功能

为什么这个运算符重载可以在 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

如果在 Windows DLL 加载期间调用 `to_string( std::stacktrace::current() )` 为什么会挂起

我使用 Visual Studio 2022 版本 17.9.2,在应用程序的异常处理程序中,我开始使用新的 C++23 功能 to_string( std::stacktrace::current() ) 记录调用堆栈。一般来说,它...

回答 1 投票 0

我可以通过 VISUAL C++ 使用所有 C++ 功能吗?

我无法找到使用 C# .net 获取 WiFi 信息(例如 RSSI 和 SSID)的方法。 C++ 可以访问本机 WiFi API。 如果我选择使用 VISUAL C++ 而不是其他编译器,我只有

回答 2 投票 0

使用 #pragma pack 时仍然会发生结构体的 C++ 填充

我正在尝试使用 C++ 结构实现 24 位整数数据类型。我希望它的大小为 24 位/3 字节——而不是填充到 4 字节 int 中。我正在使用 Visual Studio Community 2019 的编译器。 ...

回答 1 投票 0

为什么将 int 转换为 bool 会发出警告?

使用 static_cast 将 int 转换为 bool 是不是应该可以,因为它是隐式转换的逆向转换?但我仍然收到警告。 例子: MSVC++8 布尔位 = static_cast(100);

回答 4 投票 0

何时 bool 不是 bool(编译器警告 C4800)

考虑在 MS Visual Studio 2005(也可能是其他版本)中编译: CPoint点1( 1, 2 ); 点点2( 3, 4 ); const bool point1And2Identical( point1 == point2 ); // C4800 w...

回答 3 投票 0

B树插入问题,错误:向量下标超出范围

我正在实现一个B树插入功能。 但它会遇到问题。对于插入 50 个及以下的元素,它似乎工作正常,但插入 100 个元素会产生错误:

回答 1 投票 0

为原始输入获取比毫秒更高精度的 win32 时间戳

我使用原始输入作为我的游戏的输入 API,并且我希望获得输入按键的时间戳。但我发现的所有内容都是毫秒精度的(GetMessageTime())。哪个不好...

回答 1 投票 0

标识符“stack”(我的类)未定义,即使标头已正确包含

在我的源文件中,当我定义对象时,Visual Studios 说标识符“stack”未定义。我很确定我已经正确分隔了标题,但我不知道为什么会收到此错误。一个...

回答 2 投票 0

直接在 Visual Studio 中调试 CMake 项目时如何确保应用命令行参数?

#CMakeLists.txt cmake_minimum_required(版本 3.13 FATAL_ERROR) 项目(Arg示例) add_executable(ArgExample main.cpp) set_target_properties(ArgExample PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS...

回答 1 投票 0

Visual Studio 中数学和 stdlib 中不一致的未解析符号

在 Visual Studio 2022 中构建 C/C++ DLL(从多年前的 VS 2005 项目转换而来,该项目已生产多年)。链接器抱怨一些数学和 stdlib 调用......

回答 1 投票 0

在 .net 项目中使用 Visual C++ 与 CLI (cpp) 创建的二进制文件的差异

我使用可视化 cpp 程序创建了一些二进制文件。 关于数据:有嵌套的结构,包含字节、字、双字等信息。结构还包含数组[嵌套结构]。

回答 1 投票 0

自动更新CComboBox

我的 CDialog 上有一个 CComboBox,其中包含文件名列表。 文件所在的文件夹有时会更新。这意味着: 文件需要添加到列表中。 文件需要从...中删除

回答 2 投票 0

如何使用 Github Actions 中的 MSVC 编译器?

我想要一个使用 MSVC++ cl 编译器编译我的代码的管道,因为我的本机项目是在 Visual Studio 中完成的。我如何导入这些工具,以及它们适用于哪些操作系统...

回答 2 投票 0

Visual C++ 中的嵌套注释?

是否可以在 Visual C++ 中启用嵌套注释(/* /* */ */)? 我似乎找不到开关(如果有的话)。

回答 3 投票 0

[已解决]使用 STDIN 和 STDOUT 创建一个子进程,以 UTF-16 进行管道传输

我使用 CreateProcessW 函数创建了一个子进程,该子进程具有管道作为其自身与其父进程之间的 STDOUT 和 STDIN。我无法使用 WriteFile 和 ReadFile

回答 2 投票 0

使用 STDIN 和 STDOUT 创建一个位于 UTF-16 管道中的子进程

我使用 CreateProcessW 函数创建了一个子进程,该子进程具有管道作为其自身与其父进程之间的 STDOUT 和 STDIN。我无法使用 WriteFile 和 ReadFile

回答 2 投票 0

Windows .rc 文件的免费资源编辑器?

Microsoft Visual C++ Express 不包含专业版本附带的内置资源编辑器。是否有任何好的、免费的替代方案可以让您进行可视化编辑...

回答 5 投票 0

Visual Studio C++ 未检测到项目目录中新创建的头文件

好吧,我是 C++ 新手,我有 C#、Java 和 Lua 背景。 1.) 我创建了一个头文件,其中定义了一些结构和对象。 (游戏.h) #pragma 一次 #包括 #ifdef __APPLE_...

回答 1 投票 0

如何在 Visual C++ 中编写“如果文本框为空”

我正在用 Visual C++ 编写一个程序,我需要测试 TextBox 是否为空。例如(伪代码): 如果(文本框为空){ // ETC.. } 我该如何测试这种情况?

回答 3 投票 0

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