为什么不能从初始化列表中推导t && template参数? consons inst in函数: 模板

问题描述 投票:0回答:4

或任何其他期望一个参数的函数在begin()/end() - 启用类型。

为什么以下是非法的?

printme({'a', 'b', 'c'});

所有这些都是合法的: printme(std::vector<char>({'a', 'b', 'c'})); printme(std::string("abc")); printme(std::array<char, 3> {'a', 'b', 'c'});

我们甚至可以写下:

const auto il = {'a', 'b', 'c'};
printme(il);

or

printme<std::initializer_list<char>>({'a', 'b', 'c'});

您的第一行
printme({'a', 'b', 'c'})

是非法的,因为模板参数无法推断。如果您明确指定模板参数,例如

T
printme<vector<char>>({'a', 'b', 'c'})
c++ templates c++11 initializer-list
4个回答
54
投票
您列出的其他规定是合法的,因为该论点具有明确的类型,因此模板参数可以很好地推导。

您的摘要也有效,因为

printme<initializer_list<char>>({'a', 'b', 'c'})
被认为是类型
T
,因此可以推导to的模板参数。
这里唯一的“有趣”部分是
auto
会选择类型

il

,但模板参数不会。这是因为C ++ 11标准的§14.8.2.5/5明确地指出,这是模板参数的未划分的上下文:


函数参数是关联的参数是初始化器列表(8.5.4),但该参数没有std :: inditializer_list或引用可能cv-qualifiend std :: prinitiaseize_list类型。

[示例:


std::initializer_list<char>
-结束示例]

with
printme()

,第7.1.6.4/6节具有明确的支持

auto

如果初始化器是一个
式init-list

(8.5.4),则有std::initializer_list<char>.

    

您还可以超载该函数以明确采用类型pinitializer_list的参数。 template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T

第14.8.2.5/5

第14.8.2.5/。
函数参数,关联的参数是一个
初始化列表,但参数没有
auto

或参考可能与CV合格
std::initializer_list<>

类型。 [示例: std::initializer_list<U>

-最终示例]


14
投票
template<typename T> void printme(std::initializer_list<T> t) { for (auto i : t) std::cout << i; }

i发现了一个解决方案,该解决方案在问题中不适合提供的

7
投票
功能,而是针对类似的功能:

这是我开始的:

std::initializer_list

无法编译以例如:
template<class T> void g(T);
g({1,2,3}); // error: no argument deduced for T

printme<std::initializer_list<int>>( {1,2,3,4} );

基于另一个答案,我们可以添加一个模板专业化:
printme

template <typename V, typename C>
bool in(const C& container, const V& element)
{
    return std::find(container.begin(), container.end(), element) != container.end();
}

0
投票
但以下内容也有效:

in({1, 2, 3}, 1);

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.