Search code examples
c++placement-new

May this kind of rewrite of placement new compile?


Background

I am cleaning up a legacy codebase by applying a coding guideline for the new statement.

There is code like auto x = new(ClassName); that I rewrite to auto x = new ClassName();. It's quite obvious that this is not a placement new and I don't need to think about it.

However, there's also code like auto x = new(ClassName)(argument); which looks much like a placement new. For now I blindly rewrote such code to auto x = new ClassName(argument); as well.

Question

Might there be a case where a real placement new like auto x = new(placement-params)(Type); is rewritten as auto x = new placement-params(Type); and it still compiles but changes the meaning of the program?


Solution

  • placement-params is not a type, it is a value.

    Consider this code with a placement new:

    int* buf = new int;
    int* a = new(buf)(int);
    

    If we remove parenthesis around buf, the compiler can easily detect buf is not a type.

    int* a = new buf(int); // compile error
    

    Even if we create a type named buf, by the name lookup rules, the name in the inner scope is found first:

    class buf {         // found second
        buf(int) {}
    };
    
    int main() {
        int *buf = new int;  // found first
        int* a = new buf(int); // compile error
        return 0;
    }
    

    According to this answer, when type and value are in a same scope, the value is found first. For example:

    class buf {         // found second
        buf(int) {}
    };
    int *buf = new int;  // found first
    
    int main() {
        int *a = new buf(int);  // compile error
        return 0;
    }