簡體   English   中英

是否允許占位符作為 function 模板返回類型?

[英]Is placeholder allowed as function template return type?

考慮以下模板及其專業化:

template<typename R>
R func() {
    return 0;
}

template<>
auto func() {
    std::cout << "Auto deduced" << std::endl;
    return 1;
}

我不確定這樣的聲明是否被允許,但是當用 Xcode 編譯它時,clang 會發出一個奇怪的錯誤:

clang: error: unable to execute command: Segmentation fault: 11
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-macos12.3
Thread model: posix

盡管無法調用專業化,但 MSVC 編譯得很好 是否允許這樣的專業化?如果允許,如何使用?

[dcl.spec.auto.general]/13提供了以下詳細信息:

具有使用占位符類型的已聲明返回類型的 function 或 function 模板的重新聲明或特化也應使用該占位符,而不是推導類型。 類似地,具有不使用占位符類型的已聲明返回類型的 function 或 function 模板的重新聲明或特化不得使用占位符。

換句話說,任何不使用占位符返回類型的 function 模板(即使它是模板參數)都不能專門用於占位符返回類型:

template<typename R>
R func() { return 0; }

template<>
int func() { return 1; } // OK

template<>
auto func() { return "str"; } // Error. Redeclaration

類似地,任何使用占位符返回類型的模板都只能用占位符返回類型進行特化:

template<typename R>
auto func(R arg) { return arg; }

template<>
auto func(int arg) { return arg; } // OK

template<>
float func(float arg) { return arg; } // Error. Redeclaration

對於 clang,這是一個編譯器錯誤,MSVC 接受它是錯誤的,只有GCC 按預期拒絕它

<source>:9:6: error: template-id 'func<>' for 'auto func()' does not match any template declaration
    9 | auto func() {
      |      ^~~~
<source>:4:3: note: candidate is: 'template<class R> R func()'
    4 | R func() {
      |   ^~~~
Compiler returned: 1

暫無
暫無

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

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