问题与is_copy_constructible [英] Issue with is_copy_constructible

查看:304
本文介绍了问题与is_copy_constructible的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果类型特征能够处理诸如 std :: vector< std :: unique_ptr< int> > 并检测到它不是可复制构造的?

Should the type trait be able to handle cases such as std::vector < std::unique_ptr <int> > and detect that it's not copy constructible?

以下是 https://ideone.com/gbcRUa (运行g ++ 4.8.1)

Here's an example at https://ideone.com/gbcRUa (running g++ 4.8.1)

#include <type_traits>
#include <vector>
#include <iostream>
#include <memory>

int main()
{
    // This prints 1, implying that it's copy constructible, when it's clearly not
    std::cout << std::is_copy_constructible< std::vector<std::unique_ptr<int> > >::value << std::endl; 
    return 0;
}



如果这是的正确行为is_copy_constructible ,有没有办法检测到拷贝构造是不成形的?好吧,不仅仅是它无法编译。

If this is the correct behavior for is_copy_constructible, is there a way to detect that the copy construction is ill formed? Well, beyond just having it fail to compile.

推荐答案

这是因为 std :: vector std :: vector 定义拷贝构造,即使它将无法编译,并依赖于 std :: vector

This is because of a flaw in the design of std::vector. std::vector defines copy construction even if it will fail to compile, and relies on users of std::vector to not invoke the method if it will fail to compile.

另一种设计是SFINAE阻塞方法的调用,如果类型包含在 vector 没有复制构造函数。但是, std :: vector 是在开发现代SFINAE技术之前设计的。

The alternative design would be to SFINAE block the invocation of the method if the type contained in the vector does not have a copy constructor. However, std::vector was designed before modern SFINAE techniques developed.

新的C ++迭代,因为会有很少的代码会破。不能说没有代码会破坏,因为你可以有代码依赖于事实 std :: is_copy_constructible< std :: vector& no_copy_type> > 是 std :: true_type 或等效的表达式,但这是一个非常奇怪的依赖。

It could possibly be retro fitted into a new iteration of C++, as there would be very little code that would break. One cannot say no code would break, because you could have code that relies on the fact that std::is_copy_constructible< std::vector< no_copy_type > > is std::true_type, or equivalent expressions, but that is a pretty strange dependency.

除了 std :: vector 比可以解决这个问题的SFINAE技术更早的事实,使用SFINAE这样做是相当混乱的(因为SFINAE是一个凌乱的技术)。新的概念 - 为C ++ 1y提出的精简版可以使它更干净,更容易包含在语言的新的迭代中。

On top of the fact that std::vector is older than the SFINAE techniques that could solve this problem, doing so with SFINAE is pretty messy (as SFINAE is a messy technique). The new concepts-lite proposed for C++1y may make it cleaner, and more tempting to include in a new iteration of the language.

我的工作需要知道所包含的对象是否可以安全地复制,比较和排序的容器是专门用于自定义traits类上的 std :: vector ,并且回退到自定义traits类在包含类型上的值。这是一个拼凑的解决方案,非常具有侵入性。

My work around when I have a container that needs to know if the contained object can be safely copied, compared and ordered is to specialize for std::vector on a custom traits class, and fall back on the value of the custom traits class on the contained type. This is a patchwork solution, and quite intrusive.

template<template<typename>class test, typename T>
struct smart_test : test<T> {};
template<template<typename>class test, typename T, typename A>
struct smart_test<test, std::vector<T,A>> : test<T> {}

这代表我们:

template<typename T>
using smart_is_copy_constructible = smart_test< std::is_copy_constructible, T >;

和类似< c $ c> == 。我可以添加更多的专业化,当我运行更多的容器类型,应该真正转发他们的属性下降到他们的数据,或者我可以写一个fancier SFINAE容器测试和traits,并提取基础的价值类型并分派问题到测试在值类型上。

and similar for < and ==. I can add more specializations when I run into more container-types that should really forward their properties down to their data, or I could write a fancier SFINAE container-test and traits and extract the underlying value-type and dispatch the question to the test on the value-type.

但是根据我的经验,我通常最终在 std :: vector

But in my experience, I mostly end up doing these tests on std::vector.

这篇关于问题与is_copy_constructible的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆