列表初始化中多个模板化构造函数的重载规则

时间:2016-11-23 14:30:42

标签: c++ c++11 templates overloading deleted-functions

我不确定以下代码是否符合c ++ 11标准,并且在不同的实现中应该具有相同的行为:

#include <cstddef>
struct Foo{
    template <std::size_t N>
    constexpr Foo( const char ( &other )[N] )       
    {}

    template <class T>
    constexpr Foo( const  T* const& other ) = delete;
};

struct Bar {
    Foo a;
    int b;
};

int main() {
    Bar bar{ "Hello",5};
}

一般的想法是允许构造来自字符串文字和std::string(此处未显示),而不是指向const char的指针,这有点棘手(在{{3中讨论过) }})。

较新版本的g ++(&gt; = 6.0)和几乎所有clang ++版本(&gt; = 3.4)似乎编译得很好,但是使用g++-4.8 -std=c++11 main.cpp我收到以下错误:

main.cpp: In function ‘int main()’:
main.cpp:17:27: error: use of deleted function ‘constexpr Foo::Foo(const T* const&) [with T = char]’
     Bar bar{ "Hello",5};

所以我的问题是:
标准是否要求此代码具有某种行为?如果是,那么谁是对的?

1 个答案:

答案 0 :(得分:1)

{}中插入引号对我很有效,就像这样:

#include <cstddef>

struct Foo {
    template<std::size_t N>
    constexpr Foo(const char (&)[N]) {}

    template<class T>
    constexpr Foo(const T* const&) = delete;
};

struct Bar {
    Foo a;
    int b;
};

int main() {
    Bar bar{ {"Hello"}, 5 };
    //       ^^^^^^^^^
    (void)bar;
}

我在GCC 4.8.1的wandbox上进行了测试
https://wandbox.org/permlink/1TJF2NyT7mrKkqQ0

我隐约记得,这里的GCC不一定正确 关于此的缺陷报告。