以下代码片段无法在 MSVC 18.00.31101 中编译并出现以下错误,但在 gcc 4.9.2 和 clang 3.6.0 中成功。限定参数类型或在声明中包含 struct 关键字可解决错误。这是编译器错误还是未定义的行为?

#include <cstdlib>

struct A {
    int B;
};

struct Snap {
    template<size_t TSize>
    Snap(const A (&)[TSize]) {
        // do something with TSize
    }

    void A() {}
};

int main() {
    A pop[] = { {1}, {2}, {3} };

    Snap crackle(pop);

    return 0;
}

.
1> <...>: error C2664: 'Snap::Snap(const Snap &)' : cannot convert argument 1 from 'A [3]' to 'const Snap &'
1>          Reason: cannot convert from 'A [3]' to 'const Snap'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous

最佳答案

这是格式错误的,但不需要诊断。 [basic.scope.class]/p1:



在其上下文中评估的名称 A 指的是 ::A ,但在 Snap::A 的完整范围内重新评估时指的是 Snap

关于c++ - 由于成员函数与参数类型的名称冲突,模板构造函数在 MSVC 中失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29860124/

10-13 05:24