簡體   English   中英

字符串文字的模板參數推導

[英]Template argument deduction of string literal

考慮這個簡單的功能

template<typename T>
void func(const T& x) {std::cout<< typeid(T).name();}

現在,如果我調用函數func("ddd") ,T推導出什么? 如果func的參數中沒有const ,那么T就是char [4] ,讓我困惑的是添加const ,T推導出什么?

它是: const char [4] 如果我將參數更改為T const &x (即const變化順序),則推導會產生Tchar const [4]嗎?

任何人都可以用字符串文字來解釋參數推論嗎?

字符串文字是const字符的數組。

對4個字符串的字符串文字的引用是char const (&)[4]

const char [4]char const [4]是相同的類型!

char const (&)[N]const char [N]char const [N]都推導為char const [N]

#include <iostream>

template<typename T>
void func1(T& x) {std::cout<< typeid(T).name()<<std::endl;}

template<typename T>
void func2(const T& x) {std::cout<< typeid(T).name()<<std::endl;}

template<typename T>
void func3(T const &x) {std::cout<< typeid(T).name()<<std::endl;}

int main()
{
    char c[4]= {'a','b','c','d'};
    const char c1[4]= {'a','b','c','d'};
    char const c2[4]= {'a','b','c','d'};

    func1("abcd"); //prints char const [4]
    func1(c); //prints char [4]
    func1(c1); //prints char const [4]
    func1(c2); //prints char const [4]

    func2("abcd"); //prints char const [4]
    func2(c); //prints char [4]
    func2(c1); //prints char const [4]
    func2(c2); //prints char const [4]

    func3("abcd"); //prints char const [4]
    func3(c); //prints char [4]
    func3(c1); //prints char const [4]
    func3(c2); //prints char const [4]

    return 0;
}

現在,如果我調用函數func(),T推導出什么?

如果使用字符串文字調用,則T推導為char const[N]

如果func的參數中沒有const,那么T就是char [4]

如果你的意思是,如果你聲明的參數為T& x ,則沒有: T仍然會被推斷為char const[N]如果你有一個字符串調用。

如果你的意思是用非const數組調用func ,那么是: T將被推導為非const。

如果我將參數更改為T const&x

這沒有任何改變,因為const T &只是編寫T const &另一種方式。

const通常指的是它前面的任何東西:

char const * - 指向常量char的指針

char * const - 指向char的常量指針

char const * const - 常量char的常量指針

char Foo::bar() const - 返回char的常量成員函數

等等

領先的 const是一個可以追溯到C早期的例外

const char * <=> char const *

因此,更改模板中的順序根本不會改變類型( T const & <=> const T & )。

如果您希望保持 const布局的一致性 ,請僅使用尾隨類型,因為這是您可以一致地放置const的唯一方法。

暫無
暫無

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

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