将文字字符串作为模板参数传递不好

Is passing literal string as template parameter not good

我正在做一个 C++ 项目,我刚刚定义了一个函数,如下所示:

template<typename... Args>
void func(Args&&... args) {}

然后,这样称呼它:

func("abc"); // char[4]?
func("de");  // char[3]?

我的问题是编译器是否会推导出两个独立的函数,一个用于char[4],另一个用于char[3]?如果我像上面那样用const char*调用很多func,编译器会生成很多独立的函数?

这是愚蠢的吗?我应该避免这种情况吗?

其实func("abc")func(std::string("abc"));对我来说完全一样

所以我应该像 func(std::string("abc"));func(std::string("de")); 那样调用这个函数,这样编译器将只生成一个函数 void func(const std::string&);

顺便说一句,我的项目是用 C++14 开发的。

My question is if the compiler will deduce two independent functions, one is for char[4] and the other is for char[3]?

会的。

If I call many func with const char* as above, the compiler will generate many independent functions?

您不会用 const char* 调用 func。如果您只使用 const char* 调用 func,那么函数模板将只有一个实例化。

您使用 const char[4]const char[3] 调用函数,这会导致单独的实例化。每个唯一的模板参数集都会有一个实例化。

Is this stupid? Should I avoid this?

取决于用例。在许多情况下,优化器只是简单地扩展所有内联调用,并且实例化不会在生成的程序集中留下任何理论上存在的痕迹。