簡體   English   中英

對重載靜態函數的模糊調用

[英]Ambiguous call to overloaded static function

我對這種情況很困惑,谷歌搜索沒有給我答案。 基本上我有以下不編譯的簡單代碼:

#include <iostream>

class A
{
public:
    int a(int c = 0) { return 1; }
    static int a() { return 2; }
};

int main()
{
    std::cout << A::a() << std::endl;
    return 0;
}

在編譯時,GCC 4.2表示對main() A::a()的調用與a()有效候選的兩個版本都不明確。 Apple的LLVM編譯器3.0編譯時沒有錯誤。

為什么gcc對我要調用哪個函數感到困惑? 我認為很明顯,通過用A::限定a()我要求函數的static版本。 當然,如果我刪除static函數a() ,這段代碼仍然無法編譯,因為A::a()不是調用非static a()有效語法。

謝謝你的評論!

原因是因為C ++指定這是不明確的。 重載決策指定對於A::a ,因為this不在范圍內,該調用中的參數列表由設計的A對象參數增強,而不是*this 重載決策不排除非靜態成員函數,而是排除

如果參數列表由設計對象增強並且重載決策選擇T的非靜態成員函數之一,則調用是錯誤的。

最近,在核心問題1005的背景下,委員會對此進行了廣泛討論。 請參閱核心問題364 ,該問題考慮更改此規則但未執行此操作。

原因是名稱解析在編譯器執行任何其他操作之前發生,例如找出要使用的重載函數。

與修飾函數A::只是告訴編譯器“看里面A找到的名字a ”。 它實際上並沒有幫助您解決您所指的功能。

編輯

因此,當您鍵入A::a() ,首先編譯器會認為“在A查找成員函數或可以使用operator()成員”。

然后編譯器認為,“好吧,這里有兩個可能性,一個被引用? a()a(int c = 0) ,默認c=0不確定。

如果你刪除了static關鍵字並調用了像obj.a()這樣的函數,那么仍然會有歧義。

WRT LLVM的解析器

我會說它為你做了一些額外的工作,這不是標准所要求的,假設A::a()是靜態的。

暫無
暫無

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

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