【发布时间】:2016-05-02 05:14:20
【问题描述】:
源自thisCodeReview话题:
#include <cstddef>
#include <algorithm>
#include <iostream>
#include <type_traits>
#include <utility>
template <typename T>
class aggregate_wrapper : public T {
private:
using base = T;
public:
using aggregate_type = T;
template <typename... Ts>
aggregate_wrapper(Ts&&... xs)
: base{std::forward<Ts>(xs)...} {
// nop
}
};
struct foo_t {
foo_t(int) {}
};
int main() {
std::cout << std::is_constructible<foo_t>::value << std::endl;
std::cout << std::is_constructible<aggregate_wrapper<foo_t>>::value << std::endl;
// aggregate_wrapper<foo_t> v; // won't compile
}
aggregate_wrapper<foo_t> v; 没有实际编译时,std::is_constructible<aggregate_wrapper<foo_t>>::value 怎么可能是真的?
【问题讨论】:
-
也许您在心理上将 constructible 与 defaultconstructible 混为一谈?
aggregate_wrapper<foo_t>当然可以构造,只是不能通过aggregate_wrapper<foo_t> v;构造。 -
@M.M Nope、
is_default_constructible<T>和is_constructible<T>(这意味着Args...是一个空包)是等价的。 -
不确定为什么重新打开; dup 直接在点上。
-
@T.C. : 纯属意外!
标签: c++ language-lawyer c++14 template-meta-programming typetraits