簡體   English   中英

在C ++ 14中使用自動返回'type'進行顯式模板特化是否有效?

[英]Is it valid to do explicit template specialisation with auto return 'type' in C++14?

上一個問題

我重復上一個問題的代碼,使這個問題自成一體。 如果使用gcc 4.8.3編譯,下面的代碼將編譯並不會發出任何警告。 使用-std=c++1y 但是,如果使用-std=c++0x標志進行編譯,它會發出警告。 在上一個問題的上下文中,聲明代碼不使用gcc 4.9.0進行編譯。 不幸的是,目前我還不完全了解auto的實現方式。 因此,如果有人能回答以下問題,我將不勝感激:

1)。 對於C ++ 14標准,代碼下面的代碼是否有效?

2)。 如果是的話,這段代碼會被認為是一種好的風格嗎? 如果沒有,為什么不呢?

3)。 為什么下面的代碼在使用C ++ 11編譯器時編譯和工作(有時)? 或者,為什么它不總是有效? 是否有任何特定的標志/選項/設置可能阻止它工作?

template<int N> auto getOutputPort2();
template<> auto getOutputPort2<0>();
template<> auto getOutputPort2<1>();

template<>
auto getOutputPort2<0>()
{
    return std::unique_ptr<int>(new int(10));
}

template<>
auto getOutputPort2<1>()
{
    return std::unique_ptr<string>(new string("qwerty"));
}

1)。 對於C ++ 14標准,代碼下面的代碼是否有效?

是的,據我所知。 它有時候有點難以證明,因為通常沒有什么可以禁止的。 但是,我們可以在最近的草案(后N4296),[dcl.spec.auto] / 13中查看一個例子:

 template <typename T> auto g(T t) { return t; } // #1 template auto g(int); // OK, return type is int template char g(char); // error, no matching template template<> auto g(double); // OK, forward declaration with // unknown return type 

同一段落規定:

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

因此,函數模板的顯式特化必須使用返回類型推導。 我找不到任何禁止不同特殊化的不同返回類型的東西。 類似地,在C ++ 98中,通過使返回類型依賴於模板參數,可以實現函數模板特化(同一主模板)的不同返回類型。 通過使用元編程,您基本上可以實現與使用返回類型推導來為不同的特化指定不相關的返回類型時相同。


3)。 為什么下面的代碼似乎使用C ++ 11編譯器編譯和工作(有時)?

OP中的代碼在C ++ 11中是不正確的。 普通函數(非lamdas)的返回類型推導是C ++ 14中引入的一個特性。 包含此代碼段的程序格式不正確 但是,該標准並未強制要求實施(編制者)必須拒絕不正當的程序。 它只是在[intro.compliance] /2.2中說明:

如果程序包含違反任何可診斷規則的情況,則符合要求的實施方案應至少發出一條診斷消息。

和/ 8

符合條件的實現可能具有擴展(包括其他庫函數),前提是它們不會改變任何格式良好的程序的行為。 需要實現來診斷使用根據本國際標准格式不正確的擴展的程序。 但是,這樣做之后,他們就可以編譯和執行這樣的程序。

(因此實現可以接受此程序作為擴展 。)

g ++ 4.8.3發出警告,該警告計為診斷消息。 g ++ 4.9發出錯誤,這也是一條診斷消息。 兩者都符合要求。 通過指定-Werror ,您可以告訴g ++ 4.8.3拒絕該程序。 (您必須詢問gcc開發人員為什么他們已將其從警告更改為錯誤。)

暫無
暫無

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

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