How to disallow temporaries

c++

Solution

Another macro-based solution:

#define Foo class Foo

The statement `Foo("hi");` expands to `class Foo("hi");`, which is ill-formed; but `Foo a("hi")` expands to `class Foo a("hi")`, which is correct.

This has the advantage that it is both source- and binary-compatible with existing (correct) code. (This claim is not entirely correct - please see Johannes Schaub's Comment and ensuing discussion below: "How can you know that it is source compatible with existing code? His friend includes his header and has void f() { int Foo = 0; } which previously compiled fine and now miscompiles! Also, every line that defines a member function of class Foo fails: void class Foo::bar() {}")

Problem

For a class Foo, is there a way to disallow constructing it without giving it a name? For example: ``` Foo("hi"); ``` And only allow it if you give it a name, like the following? ``` Foo my_foo("hi"); ``` The lifetime of the first one is just the statement, and the second one is the enclosing block. In my use case, `Foo` is measuring the time between constructor and destructor. Since I never refer to the local variable, I often forget to put it in, and accidentally change the lifetime. I'd like to get a compile time error instead.

Original source