Я хочу иметь возможность предоставлять функции, которые принимают существующий объект заданного типа по константной ссылке.
то есть я хочу, чтобы с помощью const-ref-but-no-temporaries-created. [отредактировал эту фразу, чтобы уточнить ее!]
Я не могу придумать никакого способа выразить это на С++ напрямую:
1 void fn(const T & t)
создаст временный T
из S
, если существует (неявный) T(S)
.
2 void fn(T & t)
будет разрешать только неконстантные t
в качестве аргумента (мне нужно, чтобы это работало и для константных t
).
3 void fn(T && t)
требует неконстантного rvalue
.
4 void fn(const T && t)
требуется const rvalue
Есть ли способ сделать это - принять любой аргумент по ссылке, const, не позволяя создавать временный файл?
Неудачные мысли:
Предоставление # 2 и # 4 без предоставления двух других, и теперь у нас есть однозначный fn
, который берет ссылку на любой существующий T
(но не будет автоматически генерировать временный)?
Нет, это тоже не подходит, потому что мне также нужно иметь возможность привязываться к const T &
- где целевой объект сам передается константной ссылкой на наш вызывающий объект...
Думаю, я не вижу способа добиться этого, за исключением случая, когда я могу контролировать T
, чтобы убедиться, что он не предоставляет неявный T(S)
.
Я прав, или я пропускаю какое-то решение?
void fn(const T & t)
+void fn(const T && t) = delete
должно помочь. В качестве альтернативы поместите тудаstatic_assert
, чтобы объяснить людям, почему они должны давать временное имя, которое они хотят передать. - person nwp   schedule 30.03.2017const CString &
, фактически создают временную CString на месте - что может быть безумно низкой производительностью (когда вы это заметите) или просто перетаскиванием, когда вы этого не делаете. Поэтому мне нужны различные бесплатные fn, которые берут CString, если они уже являются CString, но, пожалуйста, не создавайте временные файлы, если они не являются (генерировать ошибку!) - person Mordachai   schedule 30.03.2017T
). Возможно, вам нужно сделать некоторые уточнения. - person Nir Friedman   schedule 30.03.2017const CString &
чем-то вродеstd::string_view
. - person nwp   schedule 30.03.2017