首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么意外触发模板构造函数可能是一件坏事?

为什么意外触发模板构造函数可能是一件坏事?
EN

Stack Overflow用户
提问于 2020-03-12 07:52:40
回答 1查看 53关注 0票数 0

EffectiveModernC++说调用模板构造函数,而不是调用默认构造函数

代码语言:javascript
复制
Person p("Nancy");
auto cloneOfP(p); 

对于类:

代码语言:javascript
复制
class Person {
public:
  template<typename T>              // perfect forwarding ctor
  explicit Person(T&& n)
  : name(std::forward<T>(n)) {}

  explicit Person(int idx);         // int ctor

  Person(const Person& rhs);        // copy ctor
                                    // (compiler-generated)

  Person(Person&& rhs);             // move ctor
  …                                 // (compiler-generated)

};

我理解p的const的缺失使模板成为一个更好的候选者。但我不明白为什么我们不想要这个?

我们不是总想调用模板版本吗,因为它会转发(rvalue、ref或lvalue)。

换句话说,我们希望触发默认(生成的)构造函数的情况是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-03-12 08:01:07

但是我不明白为什么我们不想要这个

因为它会使代码无法编译。如果我们用下面的语句完成这个示例

代码语言:javascript
复制
class Person {
public:
    template<typename T>              // perfect forwarding ctor
    explicit Person(T&& n)
    : name(std::forward<T>(n)) {}

    explicit Person(int idx);         // int ctor

    Person(const Person& rhs);        // copy ctor
                                    // (compiler-generated)

    Person(Person&& rhs);             // move ctor
    std::string name;                               // (compiler-generated)

};
int main()
{
    Person p("Nancy");
    auto cloneOfP(p); 
}

我们收到编译器错误,如下所示

代码语言:javascript
复制
main.cpp: In instantiation of 'Person::Person(T&&) [with T = Person&]':
main.cpp:28:20:   required from here
main.cpp:14:30: error: no matching function for call to 'std::__cxx11::basic_string<char>::basic_string(Person&)'
   14 |     : name(std::forward<T>(n)) {}

这就是为什么像这样的模板是一件坏事。当T是类类型时,它需要使用SFINAE来阻止它被调用。这看起来就像

代码语言:javascript
复制
class Person {
public:
    template<typename T, std::enable_if_t<!std::is_same_v<std::decay_t<T>, Person>, bool> = true>              // perfect forwarding ctor
    explicit Person(T&& n)
    : name(std::forward<T>(n)) {}

    explicit Person(int idx);         // int ctor

    Person(const Person& rhs);        // copy ctor
                                    // (compiler-generated)

    Person(Person&& rhs);             // move ctor
    std::string name;                               // (compiler-generated)

};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60645868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档