如果我在decltype

时间:2018-07-05 22:54:01

标签: c++ templates sfinae

在调试了一些(更复杂的)模板代码(在其中我使用SFINAE仅在存在特定类构造函数的情况下执行一个函数)并且无法理解该错误之后,我做了一个最小的示例,我可以似乎无法弄清楚这有什么道理。

最小(或我可以想出的最小)示例:

#include <string>

class MyClass {
public:
    MyClass(std::string s, int i){}
};

template<typename>
struct int_ {
    typedef int type;
};

template<typename U, typename int_<decltype(U("", 0))>::type = 0>
void fun(){}

int main() {
    fun<MyClass>();
    return 0;
}

^这是功能齐全,并且行为完全符合我的要求 但是如果我将第13行更改为

template<typename U, typename int_<decltype(U("", 0))>::type = 0>

template<typename U, typename int_<decltype(U(std::string(), 0))>::type = 0>

我换人失败。 (它也以declval<std::string>()等失败)

如果它无法在std::中某个深处隐藏的两种类型之间进行转换,我仍会在整理文档,但我什至不知道从哪里开始,主要是因为错误是意外的(至少我)

no matching function for call to 'MyClass::MyClass(std::basic_string<char>, std::basic_string<char>)'

no known conversion for argument 2 from 'std::basic_string<char>' to 'int'

是相关的部分(如果其他部分可能与之相关,here is a link to cpp.sh with the failing code我很困惑)

据我所知,std::string会覆盖任何后续类型,但是参数的数量保持不变。即使模板参数超过2个,它也会执行此操作(我实际上在其中使用的代码有4个,并且它说我为所有4个参数都传入了std::string

我犯了一个愚蠢的错误吗?我只是不知道为什么会这样,为什么使用char *会解决这个问题。

0 个答案:

没有答案