C++ 访问'的值&引用;str"';通过';const uint8{aka const unsigned char}';常量表达式中的值

C++ 访问'的值&引用;str"';通过';const uint8{aka const unsigned char}';常量表达式中的值,c++,c++14,constexpr,C++,C++14,Constexpr,假设下面的例子 #include <cstdint> constexpr uint64_t XYZ(uint64_t c, size_t n, const uint8_t * d) noexcept { return (c & n) + (*d); // dummy. this is actually a crc64 function } template < size_t N > inline constexpr uint64_t ABC(const

假设下面的例子

#include <cstdint>

constexpr uint64_t XYZ(uint64_t c, size_t n, const uint8_t * d) noexcept {
    return (c & n) + (*d); // dummy. this is actually a crc64 function
}

template < size_t N > inline constexpr uint64_t ABC(const char(&a)[N]) noexcept {
    return XYZ(0, a[N-1] == '\0' ? (N-1) : N, reinterpret_cast< const uint8_t * >(a));
}

int main(void)
{
    constexpr uint64_t v = ABC("str");
    return (int)v; // dummy
}
#包括
constexpr uint64_t XYZ(uint64_t c,大小n,conste uint8_t*d)不例外{
return(c&n)+(*d);//dummy。这实际上是一个crc64函数
}
模板内联constexpr uint64\u t ABC(const char(&a)[N])无例外{
返回XYZ(0,a[N-1]='\0'?(N-1):N,重新解释cast(a));
}
内部主(空)
{
constexpr uint64_t v=ABC(“str”);
return(int)v;//dummy
}
MinGW GCC 6.3似乎产生了:

main.cpp: In function 'int main()':
main.cpp:13:31:   in constexpr expansion of 'ABC<4ull>("abc")'
main.cpp:8:15:   in constexpr expansion of 'XYZ(0ull, ((a[3ull] == 0) ? 3ull : 4ull), ((const uint8_t*)a))'
main.cpp:13:37: error: accessing value of '"abc"' through a 'const uint8_t {aka const unsigned char}' glvalue in a constant expression
     constexpr uint64_t v = ABC("abc");
                                     ^
main.cpp:在函数“int main()”中:
main.cpp:13:31:ABC(“ABC”)的施工扩展
main.cpp:8:15:XYZ(0ull,((a[3ull]==0)?3ull:4ull),((const-uint8_*)a)的常数扩展
main.cpp:13:37:错误:通过常量表达式中的“const uint8{aka const unsigned char}”glvalue访问“abc”的值
constexpr uint64_t v=ABC(“ABC”);
^
如果我在
uint64\u t v
之前删除
constexpr
,它会工作。但我有点困惑,为什么当
constexpr
出现时它就不存在了


还有为什么参数
a
被看作是
char
uint8\t
aka
unsigned char

可能它将其视为一个
uint8\u t
,因为您将其强制转换为一个?是的,但我使用的是原始类型的参数,而不是强制转换产生的参数。看起来clang指出了这一点。现在它有意义了。谢谢@Shafik Yaghmour
inline
是冗余的<代码>常量表达式表达式是隐式内联的