function 在非类型模板参数的情况下,如果参数之一是占位符类型,则重载模板的选择规则是什么。 我对编译器的当前行为感到困惑,请考虑下一个示例: 这里 MSVC 在两组重载之间无法达到 select。 另一方面, GCC 始终选择具有更具体类型<int>的 function 模板。 ...
function 在非类型模板参数的情况下,如果参数之一是占位符类型,则重载模板的选择规则是什么。 我对编译器的当前行为感到困惑,请考虑下一个示例: 这里 MSVC 在两组重载之间无法达到 select。 另一方面, GCC 始终选择具有更具体类型<int>的 function 模板。 ...
我知道如果我们在 function 声明之后添加一个“const”限定符,这意味着隐含的“this”指针变为 const,因此我们不能直接修改任何成员但是,在 const 成员 function 中,每个成员是否也自动成为 const? 为了说明我要问的问题,这是一个演示程序 在 baz() 方法 ...
免责声明:这是一个XY 问题类型的问题。 是否可以将template <typename T>解析为(const T (&)[N])重载而不是(const T*) ? 例如: 为什么_print_type("oceanic"); 结果调用不明确? 当有数组时,更喜欢引用数组的重 ...
我考虑了从一种类型到另一种类型的类型转换,它通过两种方式定义,即类型转换构造函数和类型转换函数。 gcc(v13.0.0,但即使在 v4.9.4 中似乎也一样)不要抛出任何错误,只需在上面的代码中调用类型转换构造函数。 另一方面,clang(v16.0.0,但即使在 v7.6.0 中似乎也相同)抛 ...
C# 编译器响应说,在s<T>的主体中,我cannot convert from 'T' to 'int' 。 还有另一种方法可以弥合通用 - >过载差距吗? (我在 C# 10) ...
我有以下方法 但是为什么下面的调用解析为通用回退? 根据我的理解, IEnumerable<T>的重载应该比通用T: class更具体,但 C# 似乎有不同的看法。 如果我为确切类型List<T>添加重载,它工作得很好,但当然我不想为每个继承IEnumerable<T ...
我有一个 class 可以接受算术类型和 std::complex。 class 的简化代码是#include <complex> template<typename T> struct is_complex : std::false_type {}; template& ...
考虑这个例子: 它出错了: 这很好。 但是让我们交换前两行: 现在它编译没有任何错误,但是选择了 C 链接,即使最后找到了 C++ 链接。 问题: 为什么案例 2 编译而案例 1 失败? 我希望他们的行为方式相同。 对于编译的案例2,为什么选择C链接,是否可以更改? 背景:我有一个 C++ 程序, ...
考虑以下代码片段:#include <tuple> #include <type_traits> #include <utility> #include <cstddef> template <typename ...> struct ...
当 gcc 和 clang select 不同的重载构造函数从用户定义的转换运算符隐式转换时,我遇到了一个奇怪的行为。 有关代码在这里:#include <cstdio> #include <utility> #include <type_traits> tem ...
(您可能会将此问题视为与此问题的重复,但老实说,我并没有真正理解这个问题,所以我用自己的措辞单独询问。) [over.load]/1内容为: 并非所有 function 声明都可以重载。 那些不能重载的都在这里指定。 如果一个程序在同一个 scope 中包含两个这样的不可重载声明,则该程序是格 ...
我发现至少对我来说,标准没有清楚地描述确定候选转换函数的规则,用于直接引用绑定。 规则可在 [over.match.ref] 中找到在 [dcl.init.ref] 中指定的条件下,引用可以直接绑定到将 function 转换为初始化表达式的结果。 重载解析用于select转换function被调用 ...
为什么 c++ 选择原始类型重载匹配而不是“更好”匹配的初始值设定项列表? #include <vector> void foo([[maybe_unused]] int i) {} void foo([[maybe_unused]] const std::vector<int ...
这段代码我得到了奇怪和意想不到的结果: https://godbolt.org/z/8vs87vcKK Output 是: 第一个问题:我希望第一个“foo()”是“foo(string)”,为什么不是这样? 然后,当我将第一次调用 foo() 更改为: https://godbolt.org/ ...
我试图了解原始指针和向量迭代器之间的区别。 然而,下面的程序让我失望了。 模板函数是否优先于非模板函数? 预期:您好! 世界! 实际:你好! 你好! ...
tl;博士; 为什么 - 关于重载决议/函数声明 - pointer type被视为比array type更精确匹配,即使传递的变量实际上是array type而不是“只是” pointer type 我已经查看了一些关于重载解析和数组到指针衰减的等效问题(例如21972652 、 29602 ...
我有一个函数模板,该函数接受至少一个参数并对其余参数执行一些格式化: 当第一个参数是特定类型时,我希望它做不同的事情。 我喜欢编译器选择这个特定的版本,其余的可变参数都被忽略了。 所以我尝试了模板专业化: 或者: 我也尝试了非模板化的重载,尽管它总是选择第一个版本。 调用者代码应该根本 ...
C++ 模板 - 完整指南,在 §C.1 中,内容为 执行重载解决以找到最佳候选者。 如果有,则选中; 否则,调用是模棱两可的。 然后,在 §C.2 中,像这样(我的重点)对可能的匹配(给定参数与可行候选者的相应参数)进行排名: 完美的一对。 parametere ...
考虑以下示例: 我的理解是表达式Func(U{})导致函数Func的非限定名称查找,并通过 ADL 找到声明decl-2 。 但是,这不是重载决议的可行候选函数(因为它没有定义),因此编译器选择声明decl-1 。 误解,与问题无关,请参阅@LanguageLawyer 的评论 我的问题是标准中 ...
[over.ics.rank]/4 : [..] (4.3) 如果类 B 直接或间接派生自类 A,则 B* 到 A* 的转换优于 B* 到 void* 的转换,A* 到 void* 的转换优于 B* 到 void 的转换*。 所以如果我有: 调用f(bptr)更喜 ...