簡體   English   中英

不允許非成員函數重載C ++轉換運算符的原理是什么?

[英]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 ++轉換運算符的原理是什么?

使用當前規則,要確定是否可以在兩個類之間進行轉換,只需要在兩個地方查看:源定義和目標定義。 如果您可以將轉換定義為非成員函數,則轉換函數可以在任何地方使用,這可能會使查找不必要或模棱兩可的轉換的原因變得更加困難(除了使編譯器更努力地在所有需要轉換的情況下查找可能的轉換)需要或可能的,例如操作員超載)。

我認為您建議的模板不會非常實用。 盡管您可以在確實有特殊情況的情況下將其專門用於轉換,但是它仍然可以捕獲所有其他轉換,從而與任何先前存在的轉換產生歧義。

這可能是不允許這種轉換的兩個潛在因素。

如果SourceDestination之間沒有直接關系,那么我想顯式地標識它們之間的轉換,就像使用Source sourceFromDestination(const Destination&)函數一樣,不要對隨機隱式轉換感到驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM