C++ 意外的模板推断

C++ 意外的模板推断,c++,templates,C++,Templates,以下代码将在运行时编译并崩溃: template< typename T > void addVarCB(const std::string &name, TwSetVarCallback setCallback, TwGetVarCallback getCallback, void * clientData, const std::string &def = "" ); template< class

以下代码将在运行时编译并崩溃:

template< typename T >
void addVarCB(const std::string &name,
              TwSetVarCallback setCallback, TwGetVarCallback getCallback,
              void * clientData, const std::string &def = "" );

template< class C, typename T >
void addVarCB(const std::string &name,
              C * _this, T(C::*getter)(void), const std::string &def = "");
我实际上希望它根本不会编译,因为没有函数将其参数作为参数!请注意,MyClass,unsigned是不必要的,但只是为了澄清…

遗憾的是,std::string是可以从nullptr构造的,具体请参见第5节:

注:

5使用s指向的以null结尾的字符串的内容构造字符串。字符串的长度由第一个空字符决定。s不能是空指针

遗憾的是,std::string是可以从nullptr构造的,具体请参见5:

注:

5使用s指向的以null结尾的字符串的内容构造字符串。字符串的长度由第一个空字符决定。s不能是空指针


第一条评论是,这与模板推断无关。因为您提供的是模板参数,所以不会使用任何推断,而是使用第二个模板


函数调用在从nullptr转换为const char*时进行编译,该转换可用于调用接受const char*的std::string构造函数。该构造函数的约定要求指针有效,并指向代码中以null结尾的字符序列,该序列为false。

第一条注释是,这与模板推断无关。因为您提供的是模板参数,所以不会使用任何推断,而是使用第二个模板

函数调用在从nullptr转换为const char*时进行编译,该转换可用于调用接受const char*的std::string构造函数。该构造函数的约定要求指针是有效的,并指向代码中以null结尾的字符序列,该序列为false

bar_->addVarCB<MyClass, unsigned>("foo", this, &MyClass::MyClassFn, nullptr);
basic_string( const CharT* s, // <== 'nullptr' matches here
              const Allocator& alloc = Allocator() );