防止将临时对象作为参数传递给函数

Sun*_*ius 0 c++ rvalue c++11

假设我有这个:

template <typename CharType>
class StringView
{
private:
    const CharType* m_String;
    size_t m_Length;

public:
    template <typename CharTraits, typename StringAlloc>
    inline StringView(const std::basic_string<CharType, CharTraits, StringAlloc>& str) :
        m_String(str.c_str()), m_Length(str.length())
    {
    }

    inline const CharType* Str() const
    {
        return m_String;
    }
};
Run Code Online (Sandbox Code Playgroud)

有没有办法防止临时施工std::string?那是:

std::string GetStr()
{
    return "hello";
}

int main()
{
    std::string helloString = "hello";
    StringView<char> str1 = helloString; // This is ok
    StringView<char> str2 = GetStr();    // I want this to be a compiler error

    std::cout << str1.Str() << std::endl;
    std::cout << str2.Str() << std::endl;   
}
Run Code Online (Sandbox Code Playgroud)

我需要这个至少在VS 2015 C++编译器上工作.如果没有便携式解决方案,欢迎平台特定的黑客攻击.

Jar*_*d42 6

您可以删除构造函数:

template <typename CharTraits, typename StringAlloc>
StringView(std::basic_string<CharType, CharTraits, StringAlloc>&&) = delete;
Run Code Online (Sandbox Code Playgroud)