C++:可能产生与概念相关的错误 "multiple dispatch"
C++ : Possible Concepts-related bug yields "multiple dispatch"
这是怎么回事?似乎使用 auto&
参数声明 testGeneric
的能力会产生一种奇怪的情况,该函数可用于实现多重分派。
在带有“-fconcepts-ts”标志的 gcc 10.1 或更高版本上测试,也可以通过编译器资源管理器在 x86-64 clang(旧概念分支)上运行。
#include <iostream>
void testGeneric(auto &g)
{
g.print();
};
struct Generic
{
bool value = false;
void print() {
std::cout << value << std::endl;
};
};
auto main() -> int
{
auto foo = Generic();
auto bar = []() {
struct Generic
{
int value;
Generic(int v) : value(v){};
void print() {
std::cout << value << std::endl;
};
};
return Generic{123};
}();
auto baz = []() {
struct Generic
{
const char* value;
Generic(const char* v) : value(v){};
void print() {
std::cout << value << std::endl;
};
};
return Generic{"What the... ?"};
}();
testGeneric(foo); // prints 0 (false)
testGeneric(bar); // prints 123
testGeneric(baz); // prints "What the... ?"
};
testGeneric
是一个缩写函数模板。它在功能上等同于模板声明
template <class T>
void testGeneric(T &g)
{
g.print();
};
您的代码将有 3 个不同的 testGeneric
函数,一个用于您调用它的每种类型。
这是怎么回事?似乎使用 auto&
参数声明 testGeneric
的能力会产生一种奇怪的情况,该函数可用于实现多重分派。
在带有“-fconcepts-ts”标志的 gcc 10.1 或更高版本上测试,也可以通过编译器资源管理器在 x86-64 clang(旧概念分支)上运行。
#include <iostream>
void testGeneric(auto &g)
{
g.print();
};
struct Generic
{
bool value = false;
void print() {
std::cout << value << std::endl;
};
};
auto main() -> int
{
auto foo = Generic();
auto bar = []() {
struct Generic
{
int value;
Generic(int v) : value(v){};
void print() {
std::cout << value << std::endl;
};
};
return Generic{123};
}();
auto baz = []() {
struct Generic
{
const char* value;
Generic(const char* v) : value(v){};
void print() {
std::cout << value << std::endl;
};
};
return Generic{"What the... ?"};
}();
testGeneric(foo); // prints 0 (false)
testGeneric(bar); // prints 123
testGeneric(baz); // prints "What the... ?"
};
testGeneric
是一个缩写函数模板。它在功能上等同于模板声明
template <class T>
void testGeneric(T &g)
{
g.print();
};
您的代码将有 3 个不同的 testGeneric
函数,一个用于您调用它的每种类型。