gpt4 book ai didi

c++ - 通过两个隐式构造函数构造一个值?

转载 作者:太空宇宙 更新时间:2023-11-04 12:43:48 24 4
gpt4 key购买 nike

TLDR:我有两个模板化类 OuterInner . Inner<X>可以从 X 隐式构造, 和 Outer<Y>可以从 Y 隐式构造.应该Outer<Inner<X>> = X()工作?

更多详情:

假设我有以下两个类:

template<typename T> 
class Inner {
public:
Inner(const T& value) {}
Inner(T&& value) {}
};

template<typename T>
class Outer {
public:
Outer(const T& value) {}
Outer(T&& value) {}
};

考虑以下函数:

struct SomeType{};
Outer<Inner<SomeType>> DoSomethingFails() {
SomeType value;
return value;
}

g++ 提示:

no viable conversion from 'SomeType' to 'Outer<Inner<SomeType> >'
note: candidate constructor not viable: no known conversion from 'SomeType' to 'const Inner<SomeType> &' for 1st argument

但如果我改为执行以下操作:

Outer<Inner<SomeType>> DoSomethingWorks() {
SomeType value;
return Inner<SomeType>(value);
}

它有效。期待DoSomethingFails是否合理上类?如果不是,为什么?并且可以以 DoSomethingFails 的方式更改代码吗?有用吗?

最佳答案

您的第一个示例需要两个用户定义的转换才能编译 — SomeType -> Inner -> Outer .但是,最多可以隐式应用一个用户定义的转换。

引用 N3337,§12.3 [class.conv]

1   Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions (Clause 4), for initialization (8.5), and for explicit type conversions (5.4, 5.2.9).

4   At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.


如果目标是避免提及 Inner<SomeType>在返回语句中,可以使用列表初始化。

Outer<Inner<SomeType>> DoSomethingWorks2() {
SomeType value;
return {std::move(value)};
}

关于c++ - 通过两个隐式构造函数构造一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52767729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com