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 函数,一个用于您调用它的每种类型。