How to default-initialize local variables of built-in types in C++?

后端 未结 5 753
春和景丽
春和景丽 2021-01-06 20:34

How do I default-initialize a local variable of primitive type in C++? For example if a have a typedef:

typedef unsigned char boolean;//that\'s Microsoft RPC         


        
相关标签:
5条回答
  • 2021-01-06 21:13

    You can emulate that behaviour by the following:

    boolean x = boolean();
    

    or, more general,

    T x = T();
    

    This will default-initialize x if such a default-initialization exists. However, just writing T x will never do the trick for local variables, no matter what you do.

    You can also use placement-new to invoke a “constructor”, even for POD:

    T x;
    new (&x) T();
    

    Notice that this code produces undefined behaviour for non-POD types (in particular for types that have a non-trivial destructor). To make this code work with user-defined types, we first need to call the object’s destructor:

    T x;
    x.~T();
    new (&x) T();
    

    This syntax can also be used for PODs (guaranteed by §§5.2.4/12.4.15) so the above code can be used indiscriminately for any type.

    0 讨论(0)
  • 2021-01-06 21:16

    Wrapping in the struct (Boolean) as in your example and accessing via a public member (Boolean::value). It may not be the most elegant solution (some cruft for small benefit), but it similar to what you already showed.

    0 讨论(0)
  • 2021-01-06 21:20

    If I understand the original question, the poster is saying he wants variables of a given type to always have the same initial value, but he doesn't care what that value is, because he'll never look at it. Am I right?

    If so, then my question for the poster is this: If you did not initialize the variables they would have random initial values... but you said you never look at initial values - so why does it matter if they're random?

    I think the key question is - what are you trying to achieve here?

    0 讨论(0)
  • 2021-01-06 21:31

    You could provide a wrapper that behaves as the underlying type through overloaded conversion operators.

    #include <cassert>
    
    template <class T>
    class Type
    {
        T t;
    public:
        Type(const T& t = T()): t(t) {}
        operator T&() { return t; }
        operator const T&() const { return t; }
    };
    
    int main()
    {
        Type<unsigned char> some_value;
        assert(some_value == '\0');
    }
    

    This should be a rather OK usage for conversion operators.

    0 讨论(0)
  • 2021-01-06 21:40
        int var = int();
        string str = string();
        ...
    

    ...or whatever typename you want.

    0 讨论(0)
提交回复
热议问题