【发布时间】:2013-05-05 17:41:49
【问题描述】:
在 g++ 4.9.0 (20130421) 上调用下面的 extract 函数对我不起作用。我得到的错误是 s1 不是常量表达式。如果 i 可以初始化为 constexpr,那么 j 和 k 也应该初始化。那是错的吗?
#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;
}
【问题讨论】:
-
我有 75% 的把握这是编译器错误。函数调用替换应该可以解决任何引用绑定问题。