https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86610
Bug ID: 86610 Summary: non-const operator erroneously called in lambda in templated function Product: gcc Version: 8.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: daibane at sandia dot gov Target Milestone: --- The following code fails to compile, saying that the non-const operator[] is being called. GCC 7.3, Clang 6.0.0, Intel 18, and MSVC 2018 Pre all compile this code without error. Removing either the templatization of the classify2 function or the lambda around the statement allows the code to compile without error. #include <initializer_list> #include <new> template <typename T, int n> class Few { T array_[n]; public: inline T& operator[](int i) { return array_[i]; } inline T const& operator[](int i) const { return array_[i]; } Few(std::initializer_list<T> l) { int i = 0; for (auto it = l.begin(); it != l.end(); ++it) { new (array_ + (i++)) T(*it); } } inline Few() {} inline ~Few() {} inline Few(Few<T, n> const& rhs) { for (int i = 0; i < n; ++i) new (array_ + i) T(rhs[i]); } }; template <int dim> void classify2(Few<double, 3> l) { double* p = new double[1]; auto f = [=]() { p[0] = l[0]; }; f(); delete [] p; } static void classify_box(double x, double y, double z) { Few<double, 3> l({x, y, z}); classify2<3>(l); } int main() { classify_box(1.0, 1.0, 1.0); } Here is the compile error: bug.cpp: In instantiation of ‘void classify2(Few<double, 3>) [with int dim = 3]’: bug.cpp:36:17: required from here bug.cpp:28:10: error: passing ‘const Few<double, 3>’ as ‘this’ argument discards qualifiers [-fpermissive] p[0] = l[0]; bug.cpp:9:13: note: in call to ‘T& Few<T, n>::operator[](int) [with T = double; int n = 3]’ inline T& operator[](int i) { return array_[i]; } ^~~~~~~~