7

我不确定以下代码是否根据 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};
}

一般的想法是允许从字符串文字和 a std::string(此处未显示)构造,但不能从指向 的指针构造const char,这有点棘手(在这个问题中讨论)。

较新版本的 g++ (>=6.0) 和几乎所有 clang++ 版本(>=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};

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

4

1 回答 1

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 在这里不一定不正确,我隐约记得有关此的缺陷报告。

于 2018-09-10T11:04:32.717 回答