1

使用的朋友操作成語:你可以引用一個在struct中定義的朋友操作符嗎?

struct Foo { 
    friend Foo operator+(Foo, Foo) { return {}; } 
}; 

// which is synonymous to the slightly less pretty: 
struct Bar { 
    friend Bar operator+(Bar, Bar); // optional 
}; 
inline Bar operator+(Bar, Bar) { return {}; } 

我基本上希望operator+Foo的函數指針。

隨着Bar我可以說以下內容:

auto fn = static_cast<Bar (*)(Bar, Bar)>(&operator+); 
fn({},{}); 

但是,如果我做同樣的Foo版本,g ++以及鐺++告訴我:

// g++ 4.8.3 
error: ‘operator+’ not defined 
    auto f = static_cast<Foo (*)(Foo, Foo)>(&operator+); 
                ^

// clang++ 3.2-11 
error: use of undeclared 'operator+' 
    auto f = static_cast<Foo (*)(Foo, Foo)>(&operator+); 
             ^

這是本質上是不可能的或者是有一種方法可以參考該功能?

+0

內聯友元函數只能通過ADL可見。順便說一句,如果您不知道,可以在很多情況下用'{}'替換'Type {}'。 – chris

+0

@chris:是的,你說的是'{}'的事。感謝您指出。 – bitmask

回答

2

如果朋友函數只在類定義中聲明,那麼只有通過依賴於參數的查找才能通過限定或非限定查找找到它。這意味着你可以調用該函數,但不能接收它的地址。

如果你想獲取地址,那麼你還需要在周圍的命名空間中聲明它。

或者,你可以使用lambda,而不是一個老派的函數指針:

auto f = [](Foo f1, Foo f2){return f1+f2;} 
+0

也想到lambda,它讓我覺得奇怪,我無法引用該函數。感謝您的解釋。 – bitmask

相關問題