VAR在其自己的初始化器中使用
var used in its own initializer
以下代码:
auto getConnection(const std::string &name) {
constexpr const std::size_t id{findFactoryId(_factories, name)};
const auto factory = std::get<std::integral_constant<std::size_t, id>{}>(_factories).second;
for (auto &connection : _connections[id])
if (connection.first) {
connection.first = false;
decltype(factory()) &res = std::experimental::any_cast(connection.second);
return res;
}
_connections[id].emplace_back(std::make_pair<bool, std::experimental::any>(false, factory()));
decltype(factory()) &res = std::experimental::any_cast(_connections[id].back().second);
return res;
}
用clang 编译,但使用G 给出了此错误:
In file included from main.cpp:2:0:
src/core/include/connectionpool.h: Dans la fonction membre « auto Core::ConnectionPool<Connectors>::getConnection(const string&) »:
src/core/include/connectionpool.h:28:79: erreur : the value of « id » is not usable in a constant expression
const auto factory = std::get<std::integral_constant<std::size_t, id>{}>(_factories).second;
^~
src/core/include/connectionpool.h:27:41: note : « id » used in its own initializer
constexpr const std::size_t id{findFactoryId(_factories, name)};
^~
src/core/include/connectionpool.h:28:81: erreur : the value of « id » is not usable in a constant expression
const auto factory = std::get<std::integral_constant<std::size_t, id>{}>(_factories).second;
^
src/core/include/connectionpool.h:27:41: note : « id » used in its own initializer
constexpr const std::size_t id{findFactoryId(_factories, name)};
^~
src/core/include/connectionpool.h:28:81: note : in template argument for type « unsigned int »
const auto factory = std::get<std::integral_constant<std::size_t, id>{}>(_factories).second;
^
我正在使用这些命令来编译:
(clan)g++ -std=c++14 -O2 -Wall -pedantic -Wextra main.cpp
使用g++ v6.3.1
和clang++ v3.9.1
看起来对应于我的问题的唯一链接是GCC4.9的错误报告(已解决(:https://gcc.gnu.org/bugzilla/show_bug.cgi.iid=59937.p>这里提供一个最小的工作示例。
从我对gcc
错误消息的理解,我不应该有任何错误:id
不用用于初始化。
此代码是否会产生错误?
如果要引起错误,我该怎么办才能解决错误?
谢谢您的回答。
完整的代码:
#include <iostream>
#include <vector>
#include <memory>
#include <string>
#include <functional>
#include <utility>
#include <type_traits>
#include <tuple>
#include <experimental/any>
template <class F, class... Ts>
constexpr void for_each_in_tuple(const std::tuple<Ts...> &tuple, F f) {
for_each_in_tuple(tuple, f, std::make_index_sequence<sizeof...(Ts)>());
}
template <class F, class... Ts, std::size_t... Is>
constexpr void for_each_in_tuple(const std::tuple<Ts...> &tuple, F f, std::index_sequence<Is...>) {
using expander = int[];
(void) expander{0, ((void)f(Is, std::get<Is>(tuple)), 0)...};
}
template <typename... Connectors>
class ConnectionPool {
public:
auto getConnection(const std::string &name) {
constexpr const std::size_t id{findFactoryId(_factories, name)};
const auto factory = std::get<std::integral_constant<std::size_t, id>{}>(_factories).second;
return factory();
}
private:
struct foo {
constexpr foo(std::size_t &i, const std::string &name) : i(i), name(name) {}
template <class T>
constexpr void operator()(const std::size_t is, const T pair) {
i = name == pair.first ? is : i;
}
std::size_t &i;
const std::string &name;
};
template <class Tuple>
static constexpr std::size_t findFactoryId(Tuple &tup, const std::string &name) {
std::size_t i = 0;
for_each_in_tuple(tup, foo(i, name));
return i;
}
std::tuple<std::pair<std::string, std::function<Connectors()>>...> _factories;
};
int main()
{
return 0;
}
编辑
更改链接到最小工作示例:缺少一个函数。
编辑2
在帖子中添加最小工作示例
问题在此行上:
constexpr const std::size_t id{findFactoryId(_factories, name)};
constexpr
变量的初始化器必须是恒定表达式。在恒定表达式中,您无法使用this
指针。您是通过参考_factories
(即数据成员(隐式使用this
指针。
n4296 [expr.const]&para; 2
a 条件表达
e
是 corce constant表达式,除非评估e
...将评估以下表达式之一:
this
,除了constexpr
功能或constexpr
构造函数以外,该构造器正在e
的一部分;- ...
令人惊讶的是,如果我们只使用明确的this
:
constexpr const std::size_t id{findFactoryId(this->_factories, name)};
,但我不认为这是一致的。这是便携式解决方法:
const auto _this = this;
constexpr const std::size_t id{findFactoryId(_this->_factories, name)};
相关文章:
- 在未初始化映射的情况下,将值插入到映射的映射中
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 分段错误 - 读取初始化指针的数组
- 如何初始化矢量的模板化子类
- C++模板函数中的初始化 - 新的初始值设定项表达式列表被视为复合表达式
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 正在复制具有未初始化成员的结构
- 内存清理程序报告全局对象构造中未初始化值的使用
- 用向量的向量元素初始化向量的空向量
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 初始化指针的常量向量
- 在C++中全局初始化类的正确方法
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 初始化空的 2D 矢量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 初始化类的两种方法?
- 用作自己的初始值设定项的未初始化变量的行为是什么?