1
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 = "");

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

bar_->addVarCB<MyClass, unsigned>("foo", this, &MyClass::MyClassFn, nullptr);

我实际上希望它根本不会编译,因为没有将其参数作为参数的函数!(请注意,“MyClass,未签名”是不必要的,但只是为了清楚......)

4

2 回答 2

6

可悲的是,可以从这里std::string构造nullptr,具体来说:(5)

basic_string( const CharT* s, // <== 'nullptr' matches here
              const Allocator& alloc = Allocator() );

笔记:

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

于 2012-09-18T19:00:14.480 回答
5

第一个评论是这与模板推导无关。因为您提供了模板参数,所以没有使用任何推论,而是使用了第二个模板。

函数调用编译,因为有一个转换 from nullptrtoconst char*可用于调用构造函数,该std::string构造函数采用const char*. 该构造函数的合同要求指针有效并指向一个以空字符结尾的字符序列,这在您的代码中是错误的。

于 2012-09-18T19:02:36.303 回答