Use of initializer list - is it defined?

This is a discussion on Use of initializer list - is it defined? within the C++ Programming forums, part of the General Programming Boards category; Does anyone think they can answer if the order of initialization in the initialization list is defined? Ie, is this ...

  1. #1
    C++まいる!Cをこわせ! Elysia's Avatar
    Join Date
    Oct 2007
    Posts
    22,604

    Use of initializer list - is it defined?

    Does anyone think they can answer if the order of initialization in the initialization list is defined? Ie, is this safe?
    Code:
    ArrayList(): m_Size(1), m_pArray(new T[m_Size]), m_LastIndex(0)
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  2. #2
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    21,720
    It depends on the order in which the members were declared in the class definition.
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  3. #3
    C++まいる!Cをこわせ! Elysia's Avatar
    Join Date
    Oct 2007
    Posts
    22,604
    Then, if I throw it around to something like
    Code:
    	int m_Size;
    	int m_LastIndex;
    	T* m_pArray;
    	
    public:
    	ArrayList(): m_Size(1), m_pArray(new T[m_Size]), m_LastIndex(0)
    Will it be defined behavior?
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  4. #4
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    21,720
    Yes, but risky due to a possible change under maintenance, so I wouldn't do it.
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  5. #5
    C++まいる!Cをこわせ! Elysia's Avatar
    Join Date
    Oct 2007
    Posts
    22,604
    I see your point. Bad idea.
    Thanks.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  6. #6
    The larch
    Join Date
    May 2006
    Posts
    3,573
    It may not be a best idea, but the compiler might at least be able to warn, if the initialization doesn't occur in the good order (e.g that you initialize m_lastIndex after m_pArray here).
    I might be wrong.

    Thank you, anon. You sure know how to recognize different types of trees from quite a long way away.
    Quoted more than 1000 times (I hope).

  7. #7
    Captain Crash brewbuck's Avatar
    Join Date
    Mar 2007
    Location
    Portland, OR
    Posts
    7,239
    Quote Originally Posted by anon View Post
    It may not be a best idea, but the compiler might at least be able to warn, if the initialization doesn't occur in the good order (e.g that you initialize m_lastIndex after m_pArray here).
    The initialization ALWAYS occurs in the order the members are declared. If the initializer list is in a different order, the compiler will probably warn, but it doesn't change the initialization order.

    If the members were initialized in the order given in the list, then two constructors could exist which initialize the members in two different orders. Upon destruction, the members would then potentially be destructed in the wrong order.
    Code:
    //try
    //{
    	if (a) do { f( b); } while(1);
    	else   do { f(!b); } while(1);
    //}

  8. #8
    The larch
    Join Date
    May 2006
    Posts
    3,573
    Yes, I know that. May-be I worded it badly, but in the example, the initializer list is in an incorrect order and you might expect a warning.
    I might be wrong.

    Thank you, anon. You sure know how to recognize different types of trees from quite a long way away.
    Quoted more than 1000 times (I hope).

  9. #9
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,185
    Quote Originally Posted by anon View Post
    Yes, I know that. May-be I worded it badly, but in the example, the initializer list is in an incorrect order and you might expect a warning.
    I.e., gcc gives you such:
    Code:
    temp.cpp: In constructor `ArrayList::ArrayList()':
    temp.cpp:5: warning: `ArrayList::m_Size' will be initialized after
    temp.cpp:4: warning:   `int*ArrayList::m_pArray'
    temp.cpp:12: warning:   when initialized here
    temp.cpp:4: warning: `ArrayList::m_pArray' will be initialized after
    temp.cpp:3: warning:   `int ArrayList::m_LastIndex'
    temp.cpp:12: warning:   when initialized here

  10. #10
    C++まいる!Cをこわせ! Elysia's Avatar
    Join Date
    Oct 2007
    Posts
    22,604
    Visual C++ does not, however. And given that it might be a bad idea, since the order of declarations can easily change, I will not pursue it.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  11. #11
    Registered User whiteflags's Avatar
    Join Date
    Apr 2006
    Location
    United States
    Posts
    7,700
    It's your code, you should know whether that will change.

  12. #12
    C++まいる!Cをこわせ! Elysia's Avatar
    Join Date
    Oct 2007
    Posts
    22,604
    I most certainly would, but I don't want to introduce dependencies on variable declaration order.
    What if I add or remove some of them sometime? Shall I put in comments saying: this variable MUST be declared at this very exact position, and ABSOLUTELY before this and after this? Annoying.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  13. #13
    Registered User whiteflags's Avatar
    Join Date
    Apr 2006
    Location
    United States
    Posts
    7,700
    What if I add or remove some of them sometime?
    When would you do that and not also need to edit the big three?

  14. #14
    C++まいる!Cをこわせ! Elysia's Avatar
    Join Date
    Oct 2007
    Posts
    22,604
    I'm just saying I'd rather stay on the safe side. The whole issue is easily avoided in this case by using a constant.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  15. #15
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    21,720
    Quote Originally Posted by whiteflags
    When would you do that and not also need to edit the big three?
    When you re-arrange the declarations for cosmetic purposes, or maybe with the hope of better packing.

    Anyway, moving the new[] to the constructor body would be consistent with what one would do if more than one new or new[] was to be used in the constructor.
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. One more linked list implementation
    By BlackOps in forum C Programming
    Replies: 17
    Last Post: 07-16-2009, 09:34 PM
  2. Linking problems in Visual Studio
    By h3ro in forum C++ Programming
    Replies: 5
    Last Post: 03-04-2008, 01:39 PM
  3. Replies: 3
    Last Post: 03-04-2005, 01:46 PM
  4. Linked List
    By jpipitone in forum C Programming
    Replies: 4
    Last Post: 03-30-2003, 08:27 PM
  5. singly linked list
    By clarinetster in forum C Programming
    Replies: 2
    Last Post: 08-26-2001, 10:21 PM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21