https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68784

            Bug ID: 68784
           Summary: deductible parameter type still requires explicit
                    reference cast, e.g., std::thread
           Product: gcc
           Version: 4.8.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xuancong84 at gmail dot com
  Target Milestone: ---

G++ compiler is weaker than MSVC on this point.
The following piece of code is compilable using MSVC but not in g++

include <iostream>
#include <unordered_map>
#include <thread>

using namespace std;

void thread_add(unordered_map<int, int>& ht, int from, int to)
{
    for(int i = from; i <= to; ++i)
        ht.insert(unordered_map<int, int>::value_type(i, 0));
}

void main()
{
    unordered_map<int, int> ht;
    thread t[2];

    t[0] = thread(thread_add, ht, 0, 9);
    t[1] = thread(thread_add, ht, 10, 19);

    t[0].join();
    t[1].join();

    std::cout << "size: " << ht.size() << std::endl;
}

error: no type named ‘type’ in ‘class std::result_of ...


g++ require explicit reference cast:
t[0] = thread(thread_add, ref(ht), 0, 9);


However, this is unnecessary because it can be easily deduced from the
definition of the thread_add function whether to pass in a newly created copy
or a reference to the existing copy.

I hope the compiler can be improved to resolve all these deducible parameter
types so that programmers do not need to explicitly write the reference cast
std::ref() every time, like what has been done in MSVC.

Reply via email to