字符串文字参数不被接受到constexpr函数
调用以下函数extract
对g ++ 4.9.0(20130421)不起作用。我得到的错误是s1
不是一个常量表达式。如果i
可以初始化为constexpr,那么j
和k
也应该如此。那是错的吗?字符串文字参数不被接受到constexpr函数
#include <tuple>
template <unsigned N1, unsigned N2>
constexpr bool strmatch(const char (&s1)[N1], const char (&s2)[N2], unsigned i = 0)
{
return (s1[i]==s2[i]) ?
(s1[i]=='\0') ?
true
: strmatch(s1, s2, i+1)
: false;
}
template<unsigned N>
constexpr int extract(const std::tuple<int, int> & t1, const char (&array)[N]) {
return std::get<strmatch(array, "m0")>(t1);
}
int main(void)
{
constexpr int i = strmatch("m0", "m0"); // OK
constexpr int j = extract(std::make_tuple(10, 20), "m0");
constexpr int k = extract(std::make_tuple(10, 20), "m1");
return 0;
}
您的代码格式不正确。问题是,array
不是核心常量表达式,所以不能在调用模板参数可用于std::get
:
template<unsigned N>
constexpr int extract(const std::tuple<int, int> & t1, const char (&array)[N]) {
return std::get<strmatch(array, "m0")>(t1);
}
记住constexpr
功能可以在运行时调用:此代码会在翻译过程中(在对strmatch
的调用评估中)使用运行时参数的值(array
)。
这真是蹩脚!我可以将strmatch的结果赋给一个constexpr整数(i),并将它用作std :: get的模板参数。我应该能够做到这一点,而不必使用命名变量。这不是功能调用替换背后的想法吗? – Sumant 2013-05-20 22:38:43
函数调用替换仅仅是描述如何评估函数调用的形式。重申一下,你的函数'extract '可以在运行时调用,如果允许的话,通常需要在运行时发生模板实例化。 – 2013-05-21 04:33:48
对。但只要在编译时可以对提取
我75%确定这是一个编译器错误。函数调用替换应该清除任何引用绑定问题。 – aschepler 2013-05-11 00:15:22