为什么允许在gcc中编译模板版本?它是编译器错误还是与模板一起使用时实际上有效?有人可以向我解释一下吗?
它不能在godbolt.org上使用的clang或其他编译器上编译。
编译错误由constexpr中使用的字符串和字符串流生成。
#include <iostream>
#include <string>
#include <sstream>
template<typename T>
constexpr std::string func1(T a, T b) //Compiles and runs
{
std::stringstream ss;
ss << a << b << a+b;
return ss.str();
}
constexpr std::string func2(int a, int b) //Compile error
{
std::stringstream ss;
ss << a << b << a+b;
return ss.str();
}
int main()
{
int a = 5;
int b = 7;
std::cout << func1(a,b) << std::endl;
return 0;
}
答案 0 :(得分:8)
如果实例化了constexpr函数的模板特化 类模板的模板或成员函数将无法满足 constexpr函数或constexpr构造函数的要求, 该专业化仍然是constexpr功能或constexpr 构造函数,即使调用这样的函数也不能出现在 不断表达。如果没有模板的专业化 满足constexpr函数或constexpr的要求 构造函数在被视为非模板函数或构造函数时, 模板格式不正确,无需诊断。
该程序格式错误(std::string
不是文字类型)但不需要发出诊断信息。