В C ++ можно привязать временную ссылку к const:
struct A {};
int main() {
const A& a = A();
}
Есть ли способ отключить это для некоторого конкретного класса A, чтобы было невозможно привязать временное значение этого класса к константной ссылке?
Нет, и если вам нужно сделать это, вы делаете что-то еще не так.
В общем, кажется, нет способа отключить привязку временного к константной ссылке.
Однако, чтобы дать обоснованный ответ, я хотел бы привести стандарт 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 больше не требует доступного конструктора копирования в этом случае.