Search code examples
c++c++11referencervalue-referencedecltype

decltype((x)) with double brackets what does it mean?


Very simple question, I'm unable to google out the answer.

For example:

int a = 0;
int& b = x;
int&& c = 1;

decltype((a)) x; // what is the type of x?
decltype((b)) y; // what is the type of y?
decltype((c)) z; // what is the type of z?

Maybe I should assign x,y and z to some value to get different results, I'm not sure.

EDIT: According to site below double brackets turn example int into a reference: https://github.com/AnthonyCalandra/modern-cpp-features#decltype

int a = 1; // `a` is declared as type `int`
int&& f = 1; // `f` is declared as type `int&&`
decltype(f) g = 1; // `decltype(f) is `int&&`
decltype((a)) h = g; // `decltype((a))` is int&

Solution

  • According to C++ Primer:

    When we apply decltype to a variable without any parentheses, we get the type of that variable. If we wrap the variable’s name in one or more sets of parentheses, the compiler will evaluate the operand as an expression. A variable is an expression that can be the left-hand side of an assignment. As a result, decltype on such an expression yields a reference:

    // decltype of a parenthesized variable is always a reference
    decltype((i)) d; // error: d is int& and must be initialized
    decltype(i) e;   // ok: e is an (uninitialized) int