簡體   English   中英

VS2015中模板類型別名的意外行為

[英]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> (或者我錯了嗎?)。

  • 我找到了一個神奇的解決方法嗎?
  • 這是C ++ 14標准的新行為嗎?
  • 或者它只是一個編譯器錯誤?

編輯:以下更簡化的版本無法編譯。

#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.

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