Есть ли способ отключить привязку временного к константной ссылке?

В C ++ можно привязать временную ссылку к const:

struct A {};

int main() {
const A& a = A();
}

Есть ли способ отключить это для некоторого конкретного класса A, чтобы было невозможно привязать временное значение этого класса к константной ссылке?

1

Решение

Нет, и если вам нужно сделать это, вы делаете что-то еще не так.

6

Другие решения

В общем, кажется, нет способа отключить привязку временного к константной ссылке.

Однако, чтобы дать обоснованный ответ, я хотел бы привести стандарт C ++ 2003:

Если выражение инициализатора является значением r, с T2 является типом класса, а «cv1 T1» совместимо со ссылками
с помощью «cv2 T2» ссылка привязывается одним из следующих способов (выбор определяется реализацией):

— Ссылка привязана к объекту, представленному значением r (см. 3.10) или к подобъекту внутри
этот объект.

— Создается временный тип cv1 T2 [sic], и вызывается конструктор для копирования всего
Значение объекта во временном. Ссылка привязана к временному или подобъекту
во временном.
93)

Конструктор, который будет использоваться для создания копии, должен вызываться независимо от того, выполняется ли копия на самом деле.

Поэтому может показаться, что этого можно достичь в C ++ 03, сделав конструктор копирования закрытым:

struct A {
A() {}
private:
A(const A&);
};

int main() {
const A& a = A();
}

Однако это не будет работать с популярными компиляторами. Например, GCC принимает вышеуказанный код даже при -std=c++03 флаг. Clang также принимает этот код, но с предупреждением:

test.cc:8:12: предупреждение: C ++ 98 требует доступного конструктора копирования для класса ‘A’
при привязке ссылки на временный; был частным

Так что вопреки стандарту нет способа сделать это.

C ++ 11 больше не требует доступного конструктора копирования в этом случае.

2

По вопросам рекламы [email protected]