【问题标题】:C++/Cli literal Array InitializationC++/Cli 文字数组初始化
【发布时间】:2014-12-05 20:15:27
【问题描述】:

我正在尝试在托管 c++ 中创建一个常量数组,但遇到了问题。我四处搜索,但没有找到任何关于如何做到这一点的好例子。

我想要的是相当于:

const unsigned char myConstArray = {1,2,3,4,5,6};

现在我正盯着这个:

literal array<Byte>^ myConstArray = gcnew array<Byte> { 1,2,3,4,5,6};

我收集的信息是不对的,因为 Visual Studio 抱怨我不能在常量表达式中使用 gcnew。不知道去哪里,任何帮助将不胜感激。

干杯,

大卫

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

    它不适用于literal,因为:

    标记为literal 的数据成员必须在声明时进行初始化,并且值必须是常量整数、枚举或字符串类型。从初始化表达式的类型到静态 const 数据成员类型的转换必须不需要用户定义的转换。

    literal (C++ Component Extensions)

    ...但是很奇怪literal 等同于static const,但使用static const 编译时不会出错。

    创建只读属性是返回数组的另一种方式:

    ref class Test1 {
    public:
        Test1() {
            myArray = gcnew cli::array<Byte> { 1, 2, 3, 4, 5, 6};
        }
    
        property cli::array<Byte>^ MyArray {
            cli::array<Byte>^ get() {
                return myArray;
            };  
        }
    
    private:
    
        cli::array<Byte>^ myArray;
    
    };
    

    【讨论】:

    • Hmm.. 如果我将其更改为 static const,我会收到“不支持此类型的 const/volatile 限定符”的警告。它现在在编译中确实超过了这一点。我想我可以创建一个常规数组,将其设为私有,并希望如果没有其他方法,它不会被覆盖。
    • 我没想到!谢谢!
    • 工作得很好,它实际上简化了一些事情。再次感谢!
    【解决方案2】:
    std::initializer_list<unsigned char>>({1, 2, 3,4,5,6};
    

    我不确定这是否适用于托管 C++,但初始化列表是 C++11 构造,它本质上是 const 并允许应用开始和结束语义,但不允许应用数组索引。所以只要基于范围的 for 可以工作,你就可以使用这个数组。

    【讨论】:

    • 请解释一下这段代码是什么。目前,它作为答案不是很有用,并且有被删除的危险。
    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 2022-07-23
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2018-01-15
    相关资源
    最近更新 更多