3

考虑下面的代码,它试图确定嵌套 typedef 的存在。

  #include<type_traits>
  struct foo;// incomplete type
  template<class T> 
  struct seq
  {
       using value_type = T;
  };
  struct no_type{};
  template<class T>
  struct check_type : std::true_type{};
  template<> 
  struct check_type<no_type> :std::false_type{};
  template<class T> 
  struct has_value_type
  {
    template<class U>
    static auto check(U const&)-> typename U:: value_type;
     static auto check(...)->no_type;  
    static bool const value = check_type<decltype(check(std::declval<T>()))>::value;
    using type = has_value_type;
  };
  int main()
  {
      char c[has_value_type<seq<foo>>::value?1:-1];
      (void)c;
  }

现在调用has_value_type<seq>::value会导致编译错误,因为无效使用不完整类型seq<foo>::value_type。是否decltype需要表达式中的完整类型?如果没有,我该如何消除错误?我正在使用 gcc 4.7 进行编译。

4

2 回答 2

3

您的代码是有效的 C++11,它定义了显示为 decltype 操作数的顶级函数调用不会引入临时函数,即使调用是纯右值。

添加此规则是为了使您的代码有效并防止返回类型的实例化(如果它是类模板特化),否则需要确定析构函数的访问限制。

于 2012-05-14T09:06:57.943 回答
2

decltype需要一个有效的表达式,你当然可以有一个涉及不完整类型的有效表达式。但是,您的问题是

template<class U>
auto check(U const&) -> typename U::value_type;

fooUis时有返回类型seq<foo>。您不能按值返回不完整的类型,因此您最终会得到一个格式错误的表达式。您可以使用例如void_<typename U::value_type>(带template<typename T> struct void_ {};)的返回类型,并且您的测试似乎有效。

于 2012-05-14T06:09:45.957 回答