clang 编译器不像 gcc 那样编译代码

问题描述 投票:0回答:1
#include <iostream>
#include <array>

using namespace std;

template<const int *ptr>
constexpr const int *Test()
{
    return ptr + 1;
}

constexpr array<int, 3> ar{1, 2, 3};

int main()
{
    // clang version 15.0.7 - Compile Error!
    // gcc 12.2.0  - ok!!
    constexpr auto x = Test<ar.data()>(); // 1

    cout << *x << endl;
    return 0;
}

clang 编译器消息: main.cpp|18|错误:没有匹配函数来调用“测试”| main.cpp|7|注意:候选模板被忽略:模板参数“ptr”的显式指定参数无效|

我怎样才能最低限度地更正代码,以便 clang 和 gcc 都能编译?

c++ clang c++20 constexpr
1个回答
0
投票

我怎样才能最低限度地更正代码,以便 clang 和 gcc 都能编译?

你可以只使用普通数组。

constexpr int ar[3] = {1, 2, 3};
constexpr auto x = Test<ar>();

您可以使用

-std=c++17
或更高版本进行编译,只需使用一个参数:

#include <iostream>
#include <array>
constexpr const int *Test(const int *ptr) {
    return ptr + 1;
}
constexpr std::array<int, 3> ar{1, 2, 3};
int main() {
    constexpr auto x = Test(ar.data());
    std::cout << *x << std::endl;
}
© www.soinside.com 2019 - 2024. All rights reserved.