首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数中的C++自动类型推导

构造函数中的C++自动类型推导
EN

Stack Overflow用户
提问于 2017-11-27 17:40:46
回答 2查看 193关注 0票数 2

我正在努力理解我今天看到的下面的代码。我已经试图找到一个相关的问题,但是由于我不知道C++的这个特性被称为什么,所以很难找到相关的帖子。关于正确的搜索词的提示可能已经对我有帮助了。

代码语言:javascript
复制
struct A
{ int x; };

struct B
{ B(A a) {}; };

int main()
{
    B b{ { 5 } }; // works, seems to create a struct A from {5} and pass it to B's constructor
    std::make_unique<B>({ 5 }); // doesn't compile
    return 0;
}

为什么{5}在传递给make_unique时不用于创建结构A,而是在B的构造函数中以这种方式使用

如果B有第二个构造函数B(int foo) {};,那么这个构造函数将被使用,而不是上面的构造函数(至少这是我通过反复试验发现的)。确定参数是自动用于创建struct A还是直接用作构造函数中的int的规则是什么?

我正在使用Visual C++ 14.0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-27 17:53:12

下面是一个简化的演示:

代码语言:javascript
复制
struct X { X(int); };

void foo(X );
template <typename T> void bar(T );

foo({0}); // ok
bar({0}); // error

问题是,支撑的-init-list_s,那些仅仅是浮动的{...}s的结构,是C++中的奇怪野兽。它们没有类型--它们的含义必须从它们的实际使用情况中推断出来。当我们调用foo({0})时,_括号-init-list被用来构造一个X,因为这就是参数--它的行为就像我们编写了X{0}

但是在bar({0})中,我们没有足够的上下文来知道如何处理它。我们需要从参数中推断出T,但是参数没有类型--那么我们可以推断出哪种类型呢?

在这种情况下,使其工作的方法是显式地提供T

代码语言:javascript
复制
bar<X>({0}); // ok

或者提供一个具有可以推断的类型的参数:

代码语言:javascript
复制
bar(X{0});   // ok

在最初的示例中,您可以直接提供A

代码语言:javascript
复制
make_unique<B>(A{5})

或者直接使用B

代码语言:javascript
复制
make_unique<B>(B({5}))

或者直接使用new

代码语言:javascript
复制
unique_ptr<B>(new B({5}))

或者,如果不那么喜欢,并且有些可疑,则显式地指定模板参数:

代码语言:javascript
复制
make_unique<B, A>({5});
票数 5
EN

Stack Overflow用户

发布于 2017-11-27 17:46:42

在没有函数说明符C++11的情况下声明单个非默认参数(直到explicit )的构造函数称为转换构造函数。您的AB是此类构造函数的实例(这解释了为什么您的第一次调用运行良好)。问题是,std::make_unique阻碍了这些明确的调用。无论如何,这可能是一个好主意,不信任这些自动创建的第一,并花费了几个字符来显示类型。这可以提高代码的可读性。

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

https://stackoverflow.com/questions/47516821

复制
相关文章

相似问题

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