重载分辨率是一种语言机制,可以在几个可行的函数重载中进行选择。即使对于有经验的用户来说,它的规则也很复杂且经常令人惊讶。
可能的重复: 为什么 Func 与 Func> 不明确? 我注意到泛型有一个非常奇怪的重载解析问题...... 考虑以下方法: 圣...
函数重载解析不考虑返回类型,但是我在 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 捕获的错误而拒绝重载时,错误是在返回类型中还是在其他地方并不重要。
函数重载解析不考虑返回类型,但是我在 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 错误而被拒绝时,错误是在返回类型中还是在其他地方并不重要。
我编写了一个具有两个重载的函数 - 一个用于单个指针,一个用于指针向量。在代码中的某个时刻,我想将一个空向量传递给函数并使用 {} 作为参数...
我正在尝试从 cppreference.com 理解以下语言(强调我的): 每种类型的标准转换序列都被分配以下三个等级之一: 精确匹配:无需转换,
考虑以下设置: 结构体 MyInt { 模板 运算符 T() = 删除; 运算符 int(){ 返回 42; } }; 结构体 TestCAr { int arr[2]; }; 结构体 TestStdArr { ...
我试图了解 C++ 如何在继承上下文中处理成员函数指针和重载解析。我有一个带有纯虚函数的基类和一个派生类。我已经
有人可以解释一下以下示例中使用了哪些语言规则: #包括 #包括 模板 结构持有者{ T 值;
考虑以下代码: #包括 #包括 #包括 结构体A { 使用类型= std::tuple; }; 结构 B : A { 使用类型=...
我有以下输出 12 的 C++ 代码: #包括 使用命名空间 std; 模板 T foo(T val) { 返回值; } 模板 T 栏(T n) { ...
#包括 #包括 A类{ std::字符串数据; 民众: A() = 默认值; 显式 A (const char* data) : data(data) {} 运算符 const char* () const; 解释一下...
C++ 重载解决问题:如何使向量填充构造函数重载而不是向量初始化列表构造函数?
#包括 #包括 使用命名空间 std; int main() { 向量 v1 = { size_t(0),0 }; 向量 v2 = { size_t(0),0 }; 计算<< v1....
在下面的测试程序中,struct B 有两个成员函数 f,可以使用 B{}.f() 来调用:一个是普通的 f(),另一个是显式对象 f(this A)。 结构体A { int f() { 返回 1...
在 C++20 中,而不是这样做 size_t 计数 = 42; std::vector my_vector; vec.reserve(计数); std::copy_n(std::istream_iterator(std::cin), count, std::back_inserter(vec)); 我想...
这个问题是基于之前的SO讨论(受到不合规编译器的影响)。所以我使用最新的 c++23 发布版本的 gcc/clang/MSVC。 这是一个简单的测试...
给出以下代码: 模板 结构 foo_t { 结构迭代器{}; }; 模板 int f(T) { return 1; } 模板 int f(ty...
我无法理解第二个 impl 块。 根据我的理解, impl 通常用于在结构等具体类型上实现特征/方法。 然而,实施意味着什么
我无法理解第二个 impl 块。 根据我的理解, impl 通常用于在结构等具体类型上实现特征/方法。 然而,实施意味着什么
假设我的代码中的某处是一个带有通用引用参数的函数 foo ,我无法更改它: 模板 自动 foo(T&& t) { std::cout<<"general version"&...
我想实现一个流式日志库。 我创建了一个 Log_t 类来缓冲日志条目,并对其进行实际输出 毁掉了,像这样: 类 Log_t: 公共 std::ostringstream { 是...