overload-resolution 相关问题

重载分辨率是一种语言机制,可以在几个可行的函数重载中进行选择。即使对于有经验的用户来说,它的规则也很复杂且经常令人惊讶。

泛型、重载解析和委托(抱歉,找不到更好的标题)[重复]

可能的重复: 为什么 Func 与 Func> 不明确? 我注意到泛型有一个非常奇怪的重载解析问题...... 考虑以下方法: 圣...

回答 2 投票 0

通过返回类型解决重载?

函数重载解析不考虑返回类型,但是我在 cppreference 上遇到了一段代码 撇开 SFINAE 不谈,这里是如何进行重载解析的: #包括 函数重载解析不考虑返回类型,但是我在 cppreference 上遇到了一段代码 SFINAE 不谈,这里是如何进行重载解析的: #include <iostream> // This overload is added to the set of overloads if C is // a class or reference-to-class type and F is a pointer to member function of C template<class C, class F> auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { std::cout << "(1) Class/class reference overload called\n"; } // This overload is added to the set of overloads if C is a // pointer-to-class type and F is a pointer to member function of C template<class C, class F> auto test(C c, F f) -> decltype((void)((c->*f)()), void()) { std::cout << "(2) Pointer overload called\n"; } // This overload is always in the set of overloads: ellipsis // parameter has the lowest ranking for overload resolution void test(...) { std::cout << "(3) Catch-all overload called\n"; } int main() { struct X { void f() {} }; X x; X& rx = x; test(x, &X::f); // (1) test(rx, &X::f); // (1), creates a copy of x test(&x, &X::f); // (2) test(42, 1337); // (3) } 我已经查过了。这段代码有效。那么,这里是否使用尾随返回类型来进行重载解析? 重载解析不考虑返回类型 它们意味着,给定几个可行的重载,它们不会根据返回类型(是否与返回值的使用方式匹配,等等)消除歧义。 另一方面,当由于 SFINAE 捕获的错误而拒绝重载时,错误是在返回类型中还是在其他地方并不重要。

回答 1 投票 0

C++:通过返回类型进行重载解析?

函数重载解析不考虑返回类型,但是我在 Cppreference 上遇到了一段代码 除了 SFINAE 之外,这里的重载解析是如何进行的: #包括 函数重载解析不考虑返回类型,但是我在Cppreference上遇到了一段代码 SFINAE 不谈,这里的重载解析是如何发生的: #include <iostream> // This overload is added to the set of overloads if C is // a class or reference-to-class type and F is a pointer to member function of C template<class C, class F> auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { std::cout << "(1) Class/class reference overload called\n"; } // This overload is added to the set of overloads if C is a // pointer-to-class type and F is a pointer to member function of C template<class C, class F> auto test(C c, F f) -> decltype((void)((c->*f)()), void()) { std::cout << "(2) Pointer overload called\n"; } // This overload is always in the set of overloads: ellipsis // parameter has the lowest ranking for overload resolution void test(...) { std::cout << "(3) Catch-all overload called\n"; } int main() { struct X { void f() {} }; X x; X& rx = x; test(x, &X::f); // (1) test(rx, &X::f); // (1), creates a copy of x test(&x, &X::f); // (2) test(42, 1337); // (3) } 我已经查过了。这段代码有效。那么,这里是否使用尾随返回类型来进行重载解析? 重载解析不考虑返回类型 它们意味着,给定几个可行的重载,它们不会根据返回类型(是否与返回值的使用方式匹配,等等)消除歧义。 另一方面,当重载由于 SFINAE 错误而被拒绝时,错误是在返回类型中还是在其他地方并不重要。

回答 1 投票 0

指针和带有指针的容器的重载解析

我编写了一个具有两个重载的函数 - 一个用于单个指针,一个用于指针向量。在代码中的某个时刻,我想将一个空向量传递给函数并使用 {} 作为参数...

回答 1 投票 0

标准转换如何包含用户定义的转换?

我正在尝试从 cppreference.com 理解以下语言(强调我的): 每种类型的标准转换序列都被分配以下三个等级之一: 精确匹配:无需转换,

回答 1 投票 0

聚合初始化中使用的隐式转换运算符的重载解析

考虑以下设置: 结构体 MyInt { 模板 运算符 T() = 删除; 运算符 int(){ 返回 42; } }; 结构体 TestCAr { int arr[2]; }; 结构体 TestStdArr { ...

回答 1 投票 0

为什么C++在使用派生类成员函数指针时选择基类重载?

我试图了解 C++ 如何在继承上下文中处理成员函数指针和重载解析。我有一个带有纯虚函数的基类和一个派生类。我已经

回答 1 投票 0

根据对象的值类别重载用户定义的转换运算符选择反直觉重载

有人可以解释一下以下示例中使用了哪些语言规则: #包括 #包括 模板 结构持有者{ T 值;

回答 1 投票 0

违反直觉的模板重载解析

考虑以下代码: #包括 #包括 #包括 结构体A { 使用类型= std::tuple; }; 结构 B : A { 使用类型=...

回答 1 投票 0

模板函数重载行为随函数声明顺序而变化

我有以下输出 12 的 C++ 代码: #包括 使用命名空间 std; 模板 T foo(T val) { 返回值; } 模板 T 栏(T n) { ...

回答 1 投票 0

GCC14 执行多个隐式转换,而不是一次匹配的显式转换

#包括 #包括 A类{ std::字符串数据; 民众: A() = 默认值; 显式 A (const char* data) : data(data) {} 运算符 const char* () const; 解释一下...

回答 1 投票 0

C++ 重载解决问题:如何使向量填充构造函数重载而不是向量初始化列表构造函数?

#包括 #包括 使用命名空间 std; int main() { 向量 v1 = { size_t(0),0 }; 向量 v2 = { size_t(0),0 }; 计算<< v1....

回答 1 投票 0

普通和显式对象成员函数之间的重载解析

在下面的测试程序中,struct B 有两个成员函数 f,可以使用 B{}.f() 来调用:一个是普通的 f(),另一个是显式对象 f(this A)。 结构体A { int f() { 返回 1...

回答 1 投票 0

基于模板化返回类型的 C++ 函数模板专业化

在 C++20 中,而不是这样做 size_t 计数 = 42; std::vector my_vector; vec.reserve(计数); std::copy_n(std::istream_iterator(std::cin), count, std::back_inserter(vec)); 我想...

回答 1 投票 0

选择转换运算符重载会出现意外结果?

这个问题是基于之前的SO讨论(受到不合规编译器的影响)。所以我使用最新的 c++23 发布版本的 gcc/clang/MSVC。 这是一个简单的测试...

回答 1 投票 0

如何选择正确的函数模板重载?

给出以下代码: 模板 结构 foo_t { 结构迭代器{}; }; 模板 int f(T) { return 1; } 模板 int f(ty...

回答 1 投票 0

理解`impl dyn Trait`

我无法理解第二个 impl 块。 根据我的理解, impl 通常用于在结构等具体类型上实现特征/方法。 然而,实施意味着什么

回答 1 投票 0

了解 Rust 编译器的名称解析过程

我无法理解第二个 impl 块。 根据我的理解, impl 通常用于在结构等具体类型上实现特征/方法。 然而,实施意味着什么

回答 1 投票 0

C++ 重载解析,具有不可更改的通用参考函数模板

假设我的代码中的某处是一个带有通用引用参数的函数 foo ,我无法更改它: 模板 自动 foo(T&& t) { std::cout<<"general version"&...

回答 1 投票 0

专门针对所有类型指针的函数模板

我想实现一个流式日志库。 我创建了一个 Log_t 类来缓冲日志条目,并对其进行实际输出 毁掉了,像这样: 类 Log_t: 公共 std::ostringstream { 是...

回答 1 投票 0

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