【发布时间】:2015-09-24 13:47:26
【问题描述】:
我有一个删除了复制和移动 ctor 的课程。
struct A
{
A(int a):data(a){}
~A(){ std::cout << "~A()" << this << " : " << data << std::endl; }
A(A const &obj) = delete;
A(A &&obj) = delete;
friend std::ostream & operator << ( std::ostream & out , A const & obj);
int data;
};
我想用这个类的对象创建一个元组。但以下内容无法编译:
auto p = std::tuple<A,A>(A{10},A{20});
另一方面,以下确实编译,但输出令人惊讶。
int main() {
auto q = std::tuple<A&&,A&&>(A{100},A{200});
std::cout << "q created\n";
}
输出
~A()0x22fe10 : 100
~A()0x22fe30 : 200
q created
这意味着一旦元组构造线结束,就会调用对象的 dtor。那么,销毁对象的元组有什么意义呢?
【问题讨论】:
-
std::tuple<A&&,A&&>(A{100},A{200});是一个悬挂引用的元组。我认为std::tuple<A,A> p(100, 200);应该可以代替 -
@PiotrSkotnicki 它不能在 clang 或 g++ 上编译:coliru.stacked-crooked.com/a/1fe2146b7881e241
-
@NathanOliver 确实如此,使用
libc++或更新的libstdc++ -
我认为你可以用一对和
std::piecewise_construct做到这一点。 AFAIKtuple没有采用std::piecewise_construct_t的构造函数。 -
@Yakk 该构造函数将是
explicit,因为int const&不能转换为A。