模板演绎指南似乎不起作用

xvn*_*vnm 10 c++ templates c++17

在"C++模板完整指南"之后,我编写了以下代码:

#include <vector>
#include <cassert>
#include <string>

template <typename T, typename Cont = std::vector<T>>
class Stack
{
    public:
        Stack() = default;

        Stack(T elem) :
            elems({std::move(elem)})
        { }

        auto push(T const& elem)       -> void;
        auto pop()                     -> void;
        auto top()               const -> T const&;
        auto empty()             const -> bool
        {
            return elems.empty();
        }

    private:
        Cont elems;
};

Stack(char const*) -> Stack<std::string>;

template <typename T, typename Cont>
auto Stack<T, Cont>::push(T const& elem) -> void
{
    elems.push_back(elem);
}

template <typename T, typename Cont>
auto Stack<T, Cont>::pop() -> void
{
    assert(!elems.empty());
    elems.pop_back();
}

template <typename T, typename Cont>
auto Stack<T, Cont>::top() const -> T const&
{
    assert(!elems.empty());
    return elems.back();
}
Run Code Online (Sandbox Code Playgroud)

Stack在函数中使用了模板类main如下:

auto main() -> int
{
    Stack stack_string {"hello"};
    std::cout << stack_string.top().size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我认为由于我提供的"模板扣除指南",具体类型是 Stack<std::string, std::vector<std::string>>

但是编译器(Visual Studio 15 2017 with C++ 17)产生了错误,表示返回类型Stack::topconst char *const

如何使"模板扣除指南"与const char*类型一起使用?

Yak*_*ont 3

至少某些版本的 MSVC 需要:

template<std::size_t N>
Stack(char const(&)[N]) -> Stack<std::string>;
Run Code Online (Sandbox Code Playgroud)

看起来,在进行推导指南之前,它不会将数组“衰减”为指针。

活生生的例子