什么时候可以看到班级成员?

时间:2018-12-05 13:36:31

标签: c++

#include <string>
#include <map>
#include <type_traits>

using from_type = std::map<std::string, std::string>;

template<typename PK, size_t N>
struct pf {

    pf(from_type const& a, std::string const& pkn) noexcept(noexcept(fill(pk_, std::string{})))
    : map_(a) // GCC 4.8 requires ()s for references
    , pk_{ [&]{ fill(pk_, pkn); return pk_; }() }
    {
    }

    template<typename prop_t>
    typename std::enable_if<
        std::is_integral<typename std::decay<prop_t>::type>::value,
        pf<PK, N>>::type const&
    fill(prop_t& , std::string const& , prop_t  = 0) const noexcept(false);

    pf<PK, N> const&
    fill(std::string& , std::string const&) const noexcept;
protected:
    from_type const& map_;

public:
    PK pk_;
};

$ clang++ -std=c++14 -Wall -pedantic -Wextra pf.cpp
$ g++     -std=c++1y -Wall -pedantic -Wextra pf.cpp
pf.cpp:10:75: error: ‘pk_’ was not declared in this scope; did you mean ‘pkn’?
   10 |     pf(from_type const& a, std::string const& pkn) noexcept(noexcept(fill(pk_, std::string{})))
      |                                                                           ^~~
      |                                                                           pkn

成功编译:

  • clang版本8.0.0(干式348348)
  • clang版本6.0.0-1ubuntu2(标签/ RELEASE_600 / final)
  • clang版本4.0.1-10(标签/ RELEASE_401 / final)

编译失败:

  • gcc版本9.0.0 20181205(实验性)(GCC)
  • GNU C ++ 14(GCC)版本8.2.0(x86_64-pc-linux-gnu)
  • GNU C ++ 14(Ubuntu 7.3.0-27ubuntu1〜18.04)版本7.3.0(x86_64-linux-gnu)
  • gcc版本4.8.5(Ubuntu 4.8.5-4ubuntu8)

如果我将pk_的声明移到类的开头,那么GCC也会对其进行编译。

哪个编译器系列正确?

0 个答案:

没有答案