[Bug c++/78381] New: [c++17] Template Type Deduction from Constructor call with explicit deduction guide leads to constructor ambiguity
jacek at galowicz dot de
gcc-bugzilla@gcc.gnu.org
Wed Nov 16 13:28:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78381
Bug ID: 78381
Summary: [c++17] Template Type Deduction from Constructor call
with explicit deduction guide leads to constructor
ambiguity
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: jacek at galowicz dot de
Target Milestone: ---
I have the following code:
///////////////////////////////////////////////////////////
#include <tuple>
#include <type_traits>
template <typename T>
struct num_wrapper {
T value;
explicit num_wrapper(T v) : value{v} {}
// Works, if i use this one:
//explicit num_wrapper(const T &v) : value{v} {}
//explicit num_wrapper(std::decay_t<T> v) : value{v} {}
bool shift_right_and_get_lowest_bit() {
const bool lowest (value & 1);
value >>= 1;
return lowest;
}
};
template <typename T>
num_wrapper(T&&) -> num_wrapper<std::decay_t<T>>;
int main()
{
num_wrapper a_wrapper (static_cast<const int>(123));
while (a_wrapper.value != 0) {
if (a_wrapper.shift_right_and_get_lowest_bit()) {
// Do something
}
}
}
///////////////////////////////////////////////////////////
GCC git version: 357b96452a5fc70011df4f27b5d4dffc5e2f2603
When compiling it, i get the following error:
$ g++-git --std=c++1z gcc_bug.cpp
gcc_bug.cpp: In function ‘int main()’:
gcc_bug.cpp:26:55: error: call of overloaded ‘num_wrapper(const int)’ is
ambiguous
num_wrapper a_wrapper (static_cast<const int>(123));
^
gcc_bug.cpp:21:1: note: candidate: num_wrapper(T&&)-> num_wrapper<typename
std::decay<_Tp>::type> [with T = const int; typename std::decay<_Tp>::type =
int]
num_wrapper(T&&) -> num_wrapper<std::decay_t<T>>;
^~~~~~~~~~~
gcc_bug.cpp:8:14: note: candidate: num_wrapper(T)-> num_wrapper<T> [with T =
int]
explicit num_wrapper(T v) : value{v} {}
^~~~~~~~~~~
Please note the alternative constructor line which i commented out. If i
comment out the num_wrapper(T) constructor, and select one of the other ctors,
it works.
More information about the Gcc-bugs
mailing list