Ошибка компиляции GCC 7 при использовании std :: addressof

Я наблюдаю какое-то странное поведение, которое я не могу объяснить сам.
Код выглядит так:

#include <memory>
#include <vector>
#include <algorithm>

int main(){
std::vector<double> t1(10, 5.0);
std::vector<double*> t2(10);
std::transform(t1.begin(), t1.end(), t2.begin(), std::addressof<double>);
//std::transform(t1.begin(), t1.end(), t2.begin(), [](double& a){return &a;});
}

И вот версия, чтобы поиграть с https://godbolt.org/g/YcNdbf
Проблема в том, что этот код хорошо компилируется с использованием gcc4.9-6.3, но не работает под gcc 7.1. Clang тоже не нравится

(правка) Сообщения об ошибках от gcc 7.1:

<source>: In function 'int main()':
8 : <source>:8:76: error: no matching function for call to 'transform(std::vector<double>::iterator, std::vector<double>::iterator, std::vector<double*>::iterator, <unresolved overloaded function type>)'
std::transform(t1.begin(), t1.end(), t2.begin(), std::addressof<double>);
^
In file included from /opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/algorithm:62:0,
from <source>:3:
/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bits/stl_algo.h:4281:5: note: candidate: template<class _IIter, class _OIter, class _UnaryOperation> _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation)
transform(_InputIterator __first, _InputIterator __last,
^~~~~~~~~
/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bits/stl_algo.h:4281:5: note:   template argument deduction/substitution failed:
8 : <source>:8:76: note:   could not resolve address from overloaded function 'addressof<double>'
std::transform(t1.begin(), t1.end(), t2.begin(), std::addressof<double>);
^
In file included from /opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/algorithm:62:0,
from <source>:3:
/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bits/stl_algo.h:4318:5: note: candidate: template<class _IIter1, class _IIter2, class _OIter, class _BinaryOperation> _OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation)
transform(_InputIterator1 __first1, _InputIterator1 __last1,
^~~~~~~~~
/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bits/stl_algo.h:4318:5: note:   template argument deduction/substitution failed:
8 : <source>:8:76: note:   could not resolve address from overloaded function 'addressof<double>'
std::transform(t1.begin(), t1.end(), t2.begin(), std::addressof<double>);
^
Compiler exited with result code 1

Однако я не могу понять, почему это не работает.

Заранее спасибо всем, кто пытается помочь 🙂

2

Решение

Чтобы избежать случайного получения адреса временных файлов, библиотека получила вторую (удаленную) подпись для addressof:

template <class T> constexpr T* addressof(T& r) noexcept;
template <class T> const T* addressof(const T&& elem) = delete;

Увидеть http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2598

Так что теперь компилятор не знает, должен ли ваш код соответствовать удаленной функции или нет …

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]