[英]What is the rationale to not allow overloading of C++ conversions operator with non-member functions
C ++ 0x添加了顯式轉換運算符,但必須始終將它們定義為Source類的成員。 這同樣適用於賦值運算符,它必須在Target類上定義。
當所需轉換的Source和Target類彼此獨立時,Source都不能定義轉換運算符,Target也不能從Source定義構造函數。
通常我們通過定義一個特定的函數來獲得它,例如
Target ConvertToTarget(Source& v);
如果非成員函數允許C ++ 0x重載轉換運算符,則我們可以例如隱式或顯式定義不相關類型之間的轉換。
template < typename To, typename From >
operator To(const From& val);
例如,我們可以專門將chrono :: time_point轉換為posix_time :: ptime,如下所示
template < class Clock, class Duration>
operator boost::posix_time::ptime(
const boost::chrono::time_point<Clock, Duration>& from)
{
using namespace boost;
typedef chrono::time_point<Clock, Duration> time_point_t;
typedef chrono::nanoseconds duration_t;
typedef duration_t::rep rep_t;
rep_t d = chrono::duration_cast<duration_t>(
from.time_since_epoch()).count();
rep_t sec = d/1000000000;
rep_t nsec = d%1000000000;
return posix_time::from_time_t(0)+
posix_time::seconds(static_cast<long>(sec))+
posix_time::nanoseconds(nsec);
}
並將此轉換用作任何其他轉換。
有關問題的更完整說明,請參見此處或在我的Boost.Conversion庫中。
因此問題是:不允許非成員函數重載C ++轉換運算符的原理是什么?
使用當前規則,要確定是否可以在兩個類之間進行轉換,只需要在兩個地方查看:源定義和目標定義。 如果您可以將轉換定義為非成員函數,則轉換函數可以在任何地方使用,這可能會使查找不必要或模棱兩可的轉換的原因變得更加困難(除了使編譯器更努力地在所有需要轉換的情況下查找可能的轉換)需要或可能的,例如操作員超載)。
我認為您建議的模板不會非常實用。 盡管您可以在確實有特殊情況的情況下將其專門用於轉換,但是它仍然可以捕獲所有其他轉換,從而與任何先前存在的轉換產生歧義。
這可能是不允許這種轉換的兩個潛在因素。
如果Source
和Destination
之間沒有直接關系,那么我想顯式地標識它們之間的轉換,就像使用Source sourceFromDestination(const Destination&)
函數一樣,不要對隨機隱式轉換感到驚訝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.