[英]Unexpected behavior with template type alias in VS2015
以下代碼與VS15社區一起編譯並打印出“Hello”。
#include <functional>
#include <iostream>
template<typename T>
using void_template_alias_t = void;
template<typename T>
using Func = std::function<void( T )>;
template<typename T>
using FuncVoid = Func<void_template_alias_t<T>>;
int main()
{
FuncVoid<void> hello = [] { std::cout << "Hello\n"; };
hello();
}
我認為這是不允許編譯的。
我在玩,代碼有點復雜。 我天真地期望這個工作,但突然意識到這個代碼不應該編譯,因為你不能使一個Func<void>
(或者我錯了嗎?)。
編輯:以下更簡化的版本無法編譯。
#include <functional>
#include <iostream>
template<typename T>
using Func = std::function<void( T )>;
int main()
{
Func<void> hello = [] { std::cout << "Hello\n"; };
hello();
}
或者它只是一個編譯器錯誤?
那。 如@TC所述, CWG#577是相關的:
[...]如果C ++規則被更改,則對函數模板和類模板的成員函數的處理表達了一些擔憂:對於模板參數
T
, 如果函數采用類型T
的單個參數將成為無參數函數,如果它被實例化為T = void
?
這是一個合理的投訴,但不幸的是,成員函數/成員函數模板和type-id受到了解決方案的同等影響:
由非依賴類型
void
的單個未命名參數組成的參數列表等效於空參數列表。
因此,你的片段都是格式錯誤的,因為參數的類型確實是依賴的。
這是一個正確的實現,如果沒有,它會是什么樣子?
沒有正確的實施。 如果需要具有空參數列表的函數類型,則必須指定獨立於模板參數的函數類型。
那么為什么上面的代碼按照我的預期編譯和工作呢?
我最好的猜測: 在確保參數類型不是依賴類型“cv void
”之后,但在進行“ void
- >空列表轉換”之前,VC ++會替換void_template_alias_t<T>
。 但是,通常很難理解VC ++(或任何編譯器)在內部如何思考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.