Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法声明静态constexpr char[]_C++_Arrays_C++11_Static_Constexpr - Fatal编程技术网

C++ 无法声明静态constexpr char[]

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*解决了这个问题,但我失

我已经阅读了所有与这个问题相关的答案,但老实说,我不确定我是否完全理解这个解决方案。我正在使用C++11

假设我真的想声明类似于
static constexpr char value[]=“foo”

如果我使用NetBeans/TDM\u MINGW,我会得到一个错误,我想这是一个链接错误,报告了对“variable\u name”未定义的引用

在MS VS 2015中尝试相同的代码时,我得到“表达式的计算结果不是常数”

一个简单的
static constepr char*
解决了这个问题,但我失去了使用
sizeof
等表达式的能力

简单明了的问题(如果可能,直截了当的回答):

  • 是否有一种方法可以在
    struct
    /
    类中声明
    静态constepr char[]
  • 如果1)为false,是否有最干净的解决方案来克服此问题
    静态constexpr char*
  • 或者旧的
    静态常量char[]
    仍然是这种情况下的最佳方法
  • 我已经测试了一个有效的解决方案,但远不是“干净的”
    staticconsteprarray getConstExpr(){
    返回数组{“地狱”}
    }
    。它工作正常,但我必须声明char
    std::array的大小:(
  • 1) 有没有一种方法可以在
    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;
    }