簡體   English   中英

可以`template`關鍵字限定符導致代碼成功編譯,但不同嗎?

[英]Can `template` keyword qualifier cause code to compile successfully, but differently?

我正在閱讀模板關鍵字限定符( https://www.ibm.com/support/knowledgecenter/SSPSQF_9.0.0/com.ibm.xlcpp111.aix.doc/language_ref/keyword_template_qualifier.html ,以及我在哪里以及為什么必須把“模板”和“typename”關鍵字? ),但仍有一些讓我困惑的事情。

是否有可能成功編譯這樣的代碼,但會產生兩種不同的操作?

SomeObjectInstance.template some_function();
SomeObjectInstance.some_function();

是的,你可以寫出類似的東西,讓它形成良好,並給出不同的結果。 基本上你自己的例子:

#include <iostream>

struct foo {
    template <int = 0>
    void some_function() { std::cout << "template\n"; }

    void some_function() { std::cout << "non-template\n"; }
};


int main(void) {
    foo f{};

    f.some_function();
    f.template some_function();

    return 0;
}

將打印您期望的 當編譯器看到第一次調用some_function ,它必須檢查它是否可以合成模板重載。 它可以,因為我們為模板參數提供了一個默認參數。 然后它會對兩個候選者進行重載解析, [over.match.best] / 1告訴我們

給定這些定義,可行函數F1被定義為比另一個可行函數F2更好的函數,如果對於所有自變量i,ICSi(F1)不是比ICSi(F2)更差的轉換序列,然后

  • F1不是函數模板特化,F2是函數模板特化,或者,如果不是,

我們有兩個同樣好的隱式轉換序列(空),並且該子彈明確表示非模板版本是更好的候選者,因為其他一切都是相同的。

但是當使用template關鍵字時,我們遵循[temp.names] / 5

以關鍵字模板為前綴的名稱應為template-id,或者名稱應引用類模板或別名模板。

模板ID在第1段中有這種語法生成:

 simple-template-id: template-name < template-argument-list > template-id: simple-template-id operator-function-id < template-argument-list > literal-operator-id < template-argument-list > 

template-argument-list在上述所有內容中都是可選的。 但精明的讀者會注意到尖括號未指定為可選。 似乎我們必須將模板成員函數命名為some_function<> 但幸運的是我們正在進行函數調用。 模板參數推斷正在發生,因此可以應用[temp.arg.explicit] / 3

...如果可以推導出所有模板參數,則可以省略它們; 在這種情況下,也可以省略空模板參數列表<>本身。 ...

所以我們確實可以寫f.template some_function(); ,根據[temp.names] / 5,它必須引用一個模板。 這應該具有消除非模板過載的影響。

暫無
暫無

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

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