gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:39:27 27 4
gpt4 key购买 nike

我不确定以下代码是否符合 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 的指针构造,这有点棘手(在 this question 中讨论)。

较新版本的 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};

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

最佳答案

{} 中包含 initalizer 对我有用,就像这样:

#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不一定不对,我依稀记得关于此的缺陷报告。

关于c++ - 列表初始化中多个模板化构造函数的重载规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40767161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com