4

以下代码使用 gcc 编译,但不使用 clang 编译

template<typename T>
class number {
    T num;
public:
    number(T num = 0): num(num) {}
    
    template<typename T1, typename T2>
    friend auto add(T1 a, T2 b);
};

template<typename T1, typename T2>
auto add(T1 a, T2 b) {
    // this compiles with both:
        // return number<T1>{a}.num + number<T2>{b}.num;
    // this compiles only with gcc:
    return number{a}.num + number{b}.num; // <== clang is unhappy here
}

int main() {
    auto result = add(1.0, 2.0);
}

clang 提供的编译错误(版本 10.0.0 带有 -std=c++20):

error: member reference base type 'number' is not a structure or union

    return number{a}.num + number{b}.num;

           ~~~~~~~~~^~~~

error: member reference base type 'number' is not a structure or union

    return number{a}.num + number{b}.num;

                           ~~~~~~~~~^~~~

什么是正确的行为?

4

1 回答 1

0

正如 Barry 在评论中提到的,这是一个 clang 错误44468(和47870)。

错误已修复。代码现在可以在 Clang trunk 中编译并运行良好。

于 2021-01-13T17:32:27.107 回答