【发布时间】:2016-08-12 11:19:20
【问题描述】:
我有一个带有两个可变参数构造函数的结构,区别在于第二个前面有一个 int const* 参数:
struct S
{
template<class... Args> S(Args... args)
{
int arr[sizeof...(args)] = { args... }; // [A]
}
template<class... Args> S(int const *p, Args... args) {} // [B]
};
int main()
{
int i = 1;
S s(&i, 1, 2); // [C]
return 0;
}
使用 Visual C++ 2015,行 [A] 导致:error C2440: 'initializing': cannot convert from 'int *' to 'int'。如果我注释掉 [A] 行,那么它编译得很好,并且 [C] 调用 [B],所以似乎初始化列表的存在导致编译器查看函数内部并贪婪地尝试将所有参数转换为 int , 忽略解释 [B]。
如果我保留 [A] 但将 [C] 中的构造函数调用更改为 S s((int const*)&i, 1, 2); 那么它也可以编译,所以 [A] 似乎阻止了从 int* 到 int const* 的隐式转换,这通常适用于常规函数。
如果我不想在所有构造函数调用中显式 const 转换指针,而不是行 [A],我可以使用递归函数将参数包解压缩到 int 数组中,但这更麻烦。最简单的解决方案是将 [B] 更改为 template<class... Args> S(int *p, Args... args) {},但这隐藏了我不更改 *p 的意图。
【问题讨论】:
-
你可以把
int i变成constexpr int i吗? -
我可以将此示例更改为
int const i = 1并且它可以工作,但一般来说,我并不总是传递int const的地址,通常我传递的是一个数组。
标签: c++