在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C++/ 不知道長度的原始數(shù)組可否轉(zhuǎn)為std::initializer_list

不知道長度的原始數(shù)組可否轉(zhuǎn)為std::initializer_list

struct stc {
    int arr[1]; // flexible array member is not supported in C++
};

void test(std::initializer_list<int> lst) {
    for (auto l : lst)
        std::cout << l << std::endl;
}

int main() {
    stc s;
    for (int i = 0; i < 10; ++i) {
        s.arr[i] = i;
    }
    // 假設(shè)不知道數(shù)組維度10,假設(shè)此時(shí)只能獲得數(shù)組名(s.arr),即首地址
    // 如何調(diào)用test(),將s.arr的元素完整傳進(jìn)去
}
回答
編輯回答
怪痞

C++標(biāo)準(zhǔn)只規(guī)定了編譯器可以幫我們把一個(gè){}定義的常量數(shù)組轉(zhuǎn)換為一個(gè)initializer_list對象,這樣接受initializer_list為參數(shù)的函數(shù)(通常是各種構(gòu)造函數(shù)),就可以接受{},通過這種方式擴(kuò)展了語法,使我們可以像初始化普通數(shù)組那樣初始化容器,簡化了代碼。

但不要把initializer_list當(dāng)做一個(gè)普通的(容器)來用。

在GCC(4.8)的實(shí)現(xiàn)版本里,initializer_list的構(gòu)造函數(shù)被實(shí)現(xiàn)為private。除了通過{}讓編譯器幫你構(gòu)造,你不能構(gòu)造一個(gè)有效的initializer_list。

namespace std
{
  /// initializer_list
  template<class _E>
    class initializer_list
    {
    public:
      typedef _E                value_type;
      typedef const _E&         reference;
      typedef const _E&         const_reference;
      typedef size_t            size_type;
      typedef const _E*         iterator;
      typedef const _E*         const_iterator;

    private:
      iterator                  _M_array;
      size_type                 _M_len;

      // The compiler can call a private constructor.
      constexpr initializer_list(const_iterator __a, size_type __l)
      : _M_array(__a), _M_len(__l) { }

    public:
"/usr/include/c++/4.8/initializer_list" [readonly] 107 lines --17%--                   

在VC++ 2017的的實(shí)現(xiàn)版本里,initializer_list的構(gòu)造函數(shù)是public。

constexpr initializer_list(const _Elem *_First_arg,
        const _Elem *_Last_arg) _NOEXCEPT
        : _First(_First_arg), _Last(_Last_arg)
        {    // construct with pointers
        }

所以下面的代碼在VC++2017上是ok的:

#include <iostream>

void test(std::initializer_list<int> lst) {
    for (auto l : lst)
        std::cout << l << std::endl;
}

int main() {
    int a[] = { 1, 2, 3, 4 };

    test({ 1, 2, 3, 4 }); // c++ standard 

    test(std::initializer_list<int>(a, a + 4)); // compile error in gcc 4.8 but ok in vc++2017

    return 0;
}

但這是不被保證的。

C++通過庫代碼配合編譯器的方式支持了一種新的語法,這可能是讓人容易困惑的原因。

2018年7月8日 05:13