C++ 无法声明静态constexpr char[]
我已经阅读了所有与这个问题相关的答案,但老实说,我不确定我是否完全理解这个解决方案。我正在使用C++11 假设我真的想声明类似于C++ 无法声明静态constexpr char[],c++,arrays,c++11,static,constexpr,C++,Arrays,C++11,Static,Constexpr,我已经阅读了所有与这个问题相关的答案,但老实说,我不确定我是否完全理解这个解决方案。我正在使用C++11 假设我真的想声明类似于static constexpr char value[]=“foo” 如果我使用NetBeans/TDM\u MINGW,我会得到一个错误,我想这是一个链接错误,报告了对“variable\u name”未定义的引用 在MS VS 2015中尝试相同的代码时,我得到“表达式的计算结果不是常数” 一个简单的static constepr char*解决了这个问题,但我失
static constexpr char value[]=“foo”
如果我使用NetBeans/TDM\u MINGW,我会得到一个错误,我想这是一个链接错误,报告了对“variable\u name”未定义的引用
在MS VS 2015中尝试相同的代码时,我得到“表达式的计算结果不是常数”
一个简单的static constepr char*
解决了这个问题,但我失去了使用sizeof
等表达式的能力
简单明了的问题(如果可能,直截了当的回答):
struct
/类中声明静态constepr char[]
静态constexpr char*
静态常量char[]
仍然是这种情况下的最佳方法staticconsteprarray getConstExpr(){
返回数组{“地狱”}
}
。它工作正常,但我必须声明charstd::array的大小:(
struct
/类中声明静态constexpr char[]
对,;很简单
下面是一个完整的工作示例
struct bar
{ static constexpr char value[] = "foo"; };
constexpr char bar::value[];
int main ()
{
std::cout << bar::value << std::endl; // print foo
}
--编辑--
正如Swift所建议的(谢谢!)使用模板类型,而不是char
,在更灵活的函数中转换getConstExpr()
因此getConstExpr()
和helper函数(gceH()
)可以编写如下
template <typename T, std::size_t Dim, std::size_t ... Is>
constexpr std::array<T, Dim> gceH (T const (&str)[Dim],
std::index_sequence<Is...> const &)
{ return { { str[Is]... } }; }
template <typename T, std::size_t Dim>
constexpr std::array<T, Dim> getConstExpr (T const (&str)[Dim])
{ return gceH(str, std::make_index_sequence<Dim>{}); }
模板
constepr std::数组gceH(T const&str)[Dim],
std::index_序列常量&)
{return{{str[Is]…}};}
模板
constexpr std::数组getConstExpr(T const(&str)[Dim])
{返回gceH(str,std::make_index_sequence{});}
如果您想避免使用C样式的数组,还有一个C++17解决方案使用std::string\u视图。。。这要简单得多
下面是以下代码的一个示例
#include <iostream>
#include <string_view>
int main ()
{
constexpr std::string_view foo ( "Hell" );
static_assert ( 4U == foo.size (), "!" );
std::cout << "Done";
return EXIT_SUCCESS;
}
#包括
#包括
int main()
{
constexpr std::string_view foo(“地狱”);
静态_断言(4U==foo.size(),“!”;
std::cout因为C++17,您不需要做任何特殊的事情,因为静态constexpr
成员变量是隐式内联的
以下将起作用:
#include <iostream>
struct S
{
static constexpr char value[] = "Meow!\n";
};
int main()
{
std::cout << S::value;
}
#包括
结构
{
静态constexpr字符值[]=“喵喵!\n”;
};
int main()
{
std::cout-hmm,用mingw64(4.9.2)测试使用同一版本的gcc,该行工作正常。有限的c++11支持存在问题?您能提供您所读内容的参考吗?静态constexpr memeber变量仅受支持,因为c++14将有助于使字符类型的数组元素成为模板的一个参数,难道不允许模板的重用吗?出于您的目标,请您nswer@max66。我确实忘了在类范围外声明它。很高兴有你在场。@Swift-为什么不?根据你的建议修改答案。@JacintoResende-根据SwiftIn C++17的建议改进答案,不再需要在类范围外声明它。MS VS Community 2017支持它,并且对个人用户免费在Linux上,clang版本5.0也支持它。
#include <iostream>
struct S
{
static constexpr char value[] = "Meow!\n";
};
int main()
{
std::cout << S::value;
}