#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 都能编译?
我怎样才能最低限度地更正代码,以便 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;
}