Сейчас я борюсь со следующим предложением, и я хочу знать правовые и в меньшей степени моральные аргументы против этого или за него.
Что у нас было:
#include <vector>
class T;
class C
{
public:
C() { }
~C( ) { /*something non-trivial: say, calls delete for all elements in v*/ }
// a lot of member functions that modify C
// a lot of member functions that don't modify C
private:
C(C const &);
C& operator=(C const&);
private:
std::vector< T* > v;
};
void init(C& c) { } // cannot be moved inside C
// ...
int main()
{
// bad: two-phase initialization exposed to the clients
C c;
init(c);
// bad: here follows a lot of code that only wants read-only access to c
// but c cannot be declared const
}
Чтобыло предложено:
#include <vector>
class T;
class C
{
public:
C() { }
~C( ) { /*calls delete for all elements in v*/ }
// MADE PUBLIC
C(C const &); // <-- NOT DEFINED
// a lot of member functions that modify C
// a lot of member functions that don't modify C
private:
C& operator=(C const&);
private:
vector< T* > v;
};
C init() // for whatever reason object CANNOT be allocated in free memory
{
C c;
// init c
return c;
}
// ...
int main()
{
C const & c = init();
}
Это компилирует и связывает (и работает), используя последние g ++ (который является единственным целевым компилятором) и 4.1.2 и 4.4.5 - из-за (N) RVO копииконструктор никогда не вызывается;Деструктор вызывается только в конце main ().
Утверждается, что метод отлично подходит, потому что нет способа, которым конструктор копирования мог бы быть использован неправильно (если он когда-либо был сгенерирован, он быбыть ошибкой компоновщика), и его публичная публикация не позволяет компилятору жаловаться на частную.
Мне кажется, что использование такой хитрости действительно очень неправильно, что, как мне кажется, противоречит духу C ++ и больше похоже на взломв плохом смысле этого слова.
Мои чувства не являются достаточной аргументацией, поэтому я сейчас ищу технические детали.
Пожалуйста, не размещайте здесь учебник C ++:
- Мне известно о «Правиле трех» и я прочитал 12.8 / 15 и 12.2 Священного стандарта;
- Я не могу использовать ни
vector<shared_ptr<T> >
, ни ptr_vector<T>
; - Я не могу выделить
C
в свободной памяти и вернуть его из init
через C*
.
Спасибо.